[libvirt] [PATCH] esx: Simplify goto usage (part 2/2)

Eliminate almost all backward jumps by replacing this common pattern: int some_random_function(void) { int result = 0; ... cleanup: <unconditional cleanup code> return result; failure: <cleanup code in case of an error> result = -1; goto cleanup } with this simpler pattern: int some_random_function(void) { int result = -1; ... result = 0; cleanup: if (result < 0) { <cleanup code in case of an error> } <unconditional cleanup code> return result; } Add a bool success variable in functions that don't have a int result that can be used for the new pattern. Also remove some unnecessary memsets in error paths. --- I've split this 200kb patch into two 100kb parts. Part 1: src/esx/esx_driver.c | 840 ++++++++++++++++++------------------------ src/esx/esx_storage_driver.c | 4 - src/esx/esx_util.c | 74 ++-- Part 2: src/esx/esx_vi.c | 488 +++++++++++-------------- src/esx/esx_vi_methods.c | 44 +-- src/esx/esx_vi_types.c | 23 +- src/esx/esx_vmx.c | 298 ++++++++------- 7 files changed, 793 insertions(+), 978 deletions(-) diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 1483f05..c535dbb 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -279,7 +279,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, const char *ipAddress, const char *username, const char *password, int noVerify) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *datacenterList = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -288,12 +288,12 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, password == NULL || ctx->url != NULL || ctx->service != NULL || ctx->curl_handle != NULL || ctx->curl_headers != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } if (esxVI_String_DeepCopyValue(&ctx->url, url) < 0 || esxVI_String_DeepCopyValue(&ctx->ipAddress, ipAddress) < 0) { - goto failure; + goto cleanup; } ctx->curl_handle = curl_easy_init(); @@ -301,7 +301,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (ctx->curl_handle == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not initialize CURL")); - goto failure; + goto cleanup; } ctx->curl_headers = curl_slist_append(ctx->curl_headers, "Content-Type: " @@ -321,7 +321,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (ctx->curl_headers == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not build CURL header list")); - goto failure; + goto cleanup; } curl_easy_setopt(ctx->curl_handle, CURLOPT_URL, ctx->url); @@ -346,7 +346,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (virMutexInit(&ctx->curl_lock) < 0) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not initialize CURL mutex")); - goto failure; + goto cleanup; } ctx->username = strdup(username); @@ -354,11 +354,11 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (ctx->username == NULL || ctx->password == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } if (esxVI_RetrieveServiceContent(ctx, &ctx->service) < 0) { - goto failure; + goto cleanup; } if (STREQ(ctx->service->about->apiType, "HostAgent") || @@ -371,7 +371,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VI API major/minor version '2.5' or '4.0' " "but found '%s'"), ctx->service->about->apiVersion); - goto failure; + goto cleanup; } if (STREQ(ctx->service->about->productLineId, "gsx")) { @@ -381,7 +381,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting GSX major/minor version '2.0' but " "found '%s'"), ctx->service->about->version); - goto failure; + goto cleanup; } } else if (STREQ(ctx->service->about->productLineId, "esx") || STREQ(ctx->service->about->productLineId, "embeddedEsx")) { @@ -394,7 +394,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, _("Expecting ESX major/minor version '3.5' or " "'4.0' but found '%s'"), ctx->service->about->version); - goto failure; + goto cleanup; } } else if (STREQ(ctx->service->about->productLineId, "vpx")) { if (STRPREFIX(ctx->service->about->version, "2.5")) { @@ -405,24 +405,24 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VPX major/minor version '2.5' or '4.0' " "but found '%s'"), ctx->service->about->version); - goto failure; + goto cleanup; } } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting product 'gsx' or 'esx' or 'embeddedEsx' " "or 'vpx' but found '%s'"), ctx->service->about->productLineId); - goto failure; + goto cleanup; } } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VI API type 'HostAgent' or 'VirtualCenter' " "but found '%s'"), ctx->service->about->apiType); - goto failure; + goto cleanup; } if (esxVI_Login(ctx, username, password, NULL, &ctx->session) < 0) { - goto failure; + goto cleanup; } esxVI_BuildFullTraversalSpecList(&ctx->fullTraversalSpecList); @@ -430,7 +430,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (esxVI_String_AppendValueListToList(&propertyNameList, "vmFolder\0" "hostFolder\0") < 0) { - goto failure; + goto cleanup; } /* Get pointer to Datacenter for later use */ @@ -438,14 +438,14 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, "Datacenter", propertyNameList, esxVI_Boolean_True, &datacenterList) < 0) { - goto failure; + goto cleanup; } if (datacenterList == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the 'datacenter' object from the " "VI host/center")); - goto failure; + goto cleanup; } ctx->datacenter = datacenterList->obj; @@ -457,12 +457,12 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (STREQ(dynamicProperty->name, "vmFolder")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, &ctx->vmFolder)) { - goto failure; + goto cleanup; } } else if (STREQ(dynamicProperty->name, "hostFolder")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, &ctx->hostFolder)) { - goto failure; + goto cleanup; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -473,19 +473,16 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("The 'datacenter' object is missing the " "'vmFolder'/'hostFolder' property")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&datacenterList); return result; - - failure: - result = -1; - - goto cleanup; } int @@ -496,7 +493,7 @@ esxVI_Context_DownloadFile(esxVI_Context *ctx, const char *url, char **content) if (content == NULL || *content != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } virMutexLock(&ctx->curl_lock); @@ -511,27 +508,28 @@ esxVI_Context_DownloadFile(esxVI_Context *ctx, const char *url, char **content) virMutexUnlock(&ctx->curl_lock); if (responseCode < 0) { - goto failure; + goto cleanup; } else if (responseCode != 200) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HTTP response code %d for download from '%s'"), responseCode, url); - goto failure; + goto cleanup; } if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } *content = virBufferContentAndReset(&buffer); - return 0; - - failure: - virBufferFreeAndReset(&buffer); + cleanup: + if (*content == NULL) { + virBufferFreeAndReset(&buffer); + return -1; + } - return -1; + return 0; } int @@ -573,7 +571,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, const char *request, esxVI_Response **response, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; virBuffer buffer = VIR_BUFFER_INITIALIZER; esxVI_Fault *fault = NULL; char *xpathExpression = NULL; @@ -582,11 +580,11 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, if (request == NULL || response == NULL || *response != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } if (esxVI_Response_Alloc(response) < 0) { - goto failure; + return -1; } virMutexLock(&ctx->curl_lock); @@ -602,12 +600,12 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, virMutexUnlock(&ctx->curl_lock); if ((*response)->responseCode < 0) { - goto failure; + goto cleanup; } if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } (*response)->content = virBufferContentAndReset(&buffer); @@ -620,14 +618,14 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Response for call to '%s' could not be parsed"), methodName); - goto failure; + goto cleanup; } if (xmlDocGetRootElement((*response)->document) == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Response for call to '%s' is an empty XML document"), methodName); - goto failure; + goto cleanup; } xpathContext = xmlXPathNewContext((*response)->document); @@ -635,7 +633,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, if (xpathContext == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not create XPath context")); - goto failure; + goto cleanup; } xmlXPathRegisterNs(xpathContext, BAD_CAST "soapenv", @@ -652,7 +650,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, _("HTTP response code %d for call to '%s'. " "Fault is unknown, XPath evaluation failed"), (*response)->responseCode, methodName); - goto failure; + goto cleanup; } if (esxVI_Fault_Deserialize((*response)->node, &fault) < 0) { @@ -660,7 +658,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, _("HTTP response code %d for call to '%s'. " "Fault is unknown, deserialization failed"), (*response)->responseCode, methodName); - goto failure; + goto cleanup; } ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, @@ -673,13 +671,13 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, (*response)->responseCode, methodName, (*response)->content); - goto failure; + goto cleanup; } else { if (virAsprintf(&xpathExpression, "/soapenv:Envelope/soapenv:Body/vim:%sResponse", methodName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } responseNode = virXPathNode(xpathExpression, xpathContext); @@ -688,7 +686,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("XPath evaluation of response for call to '%s' " "failed"), methodName); - goto failure; + goto cleanup; } xpathContext->node = responseNode; @@ -700,12 +698,12 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned an empty result, " "expecting a non-empty result"), methodName); - goto failure; + goto cleanup; } else if ((*response)->node->next != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned a list, expecting " "exactly one item"), methodName); - goto failure; + goto cleanup; } break; @@ -715,7 +713,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned an empty result, " "expecting a non-empty result"), methodName); - goto failure; + goto cleanup; } break; @@ -726,7 +724,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned a list, expecting " "exactly one item"), methodName); - goto failure; + goto cleanup; } break; @@ -740,7 +738,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned something, expecting " "an empty result"), methodName); - goto failure; + goto cleanup; } break; @@ -748,30 +746,29 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, default: ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument (occurrence)")); - goto failure; + goto cleanup; } } } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HTTP response code %d for call to '%s'"), (*response)->responseCode, methodName); - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virBufferFreeAndReset(&buffer); + esxVI_Response_Free(response); + esxVI_Fault_Free(&fault); + } + VIR_FREE(xpathExpression); xmlXPathFreeContext(xpathContext); return result; - - failure: - virBufferFreeAndReset(&buffer); - esxVI_Response_Free(response); - esxVI_Fault_Free(&fault); - - result = -1; - - goto cleanup; } @@ -877,39 +874,36 @@ esxVI_Enumeration_Deserialize(const esxVI_Enumeration *enumeration, xmlNodePtr node, int *value) { int i; - int result = 0; + int result = -1; char *name = NULL; if (value == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } *value = 0; /* undefined */ if (esxVI_String_DeserializeValue(node, &name) < 0) { - goto failure; + return -1; } for (i = 0; enumeration->values[i].name != NULL; ++i) { if (STREQ(name, enumeration->values[i].name)) { *value = enumeration->values[i].value; - goto cleanup; + result = 0; + break; } } - ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unknown value '%s' for %s"), - name, esxVI_Type_ToString(enumeration->type)); + if (result < 0) { + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unknown value '%s' for %s"), + name, esxVI_Type_ToString(enumeration->type)); + } - cleanup: VIR_FREE(name); return result; - - failure: - result = -1; - - goto cleanup; } @@ -954,7 +948,7 @@ esxVI_List_DeepCopy(esxVI_List **destList, esxVI_List *srcList, if (destList == NULL || *destList != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } for (src = srcList; src != NULL; src = src->_next) { @@ -980,7 +974,7 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list, esxVI_List_CastFromAnyTypeFunc castFromAnyTypeFunc, esxVI_List_FreeFunc freeFunc) { - int result = 0; + int result = -1; xmlNodePtr childNode = NULL; esxVI_AnyType *childAnyType = NULL; esxVI_List *item = NULL; @@ -1007,7 +1001,7 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list, if (childNode->type != XML_ELEMENT_NODE) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Wrong XML element type %d"), childNode->type); - goto failure; + goto cleanup; } esxVI_AnyType_Free(&childAnyType); @@ -1015,24 +1009,23 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list, if (esxVI_AnyType_Deserialize(childNode, &childAnyType) < 0 || castFromAnyTypeFunc(childAnyType, &item) < 0 || esxVI_List_Append(list, item) < 0) { - goto failure; + goto cleanup; } item = NULL; } + result = 0; + cleanup: + if (result < 0) { + freeFunc(&item); + freeFunc(list); + } + esxVI_AnyType_Free(&childAnyType); return result; - - failure: - freeFunc(&item); - freeFunc(list); - - result = -1; - - goto cleanup; } int @@ -1300,7 +1293,7 @@ esxVI_EnsureSession(esxVI_Context *ctx) #if ESX_VI_USE_SESSION_IS_ACTIVE esxVI_Boolean active = esxVI_Boolean_Undefined; #else - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *sessionManager = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -1335,7 +1328,7 @@ esxVI_EnsureSession(esxVI_Context *ctx) "SessionManager", propertyNameList, esxVI_Boolean_False, &sessionManager) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = sessionManager->propSet; dynamicProperty != NULL; @@ -1343,7 +1336,7 @@ esxVI_EnsureSession(esxVI_Context *ctx) if (STREQ(dynamicProperty->name, "currentSession")) { if (esxVI_UserSession_CastFromAnyType(dynamicProperty->val, ¤tSession) < 0) { - goto failure; + goto cleanup; } break; @@ -1357,26 +1350,23 @@ esxVI_EnsureSession(esxVI_Context *ctx) if (esxVI_Login(ctx, ctx->username, ctx->password, NULL, &ctx->session) < 0) { - goto failure; + goto cleanup; } } else if (STRNEQ(ctx->session->key, currentSession->key)) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Key of the current session differs from the key at " "last login")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&sessionManager); esxVI_UserSession_Free(¤tSession); return result; - - failure: - result = -1; - - goto cleanup; #endif } @@ -1390,7 +1380,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, esxVI_Boolean recurse, esxVI_ObjectContent **objectContentList) { - int result = 0; + int result = -1; esxVI_ObjectSpec *objectSpec = NULL; esxVI_PropertySpec *propertySpec = NULL; esxVI_PropertyFilterSpec *propertyFilterSpec = NULL; @@ -1401,7 +1391,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, } if (esxVI_ObjectSpec_Alloc(&objectSpec) < 0) { - goto failure; + return -1; } objectSpec->obj = root; @@ -1412,7 +1402,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, } if (esxVI_PropertySpec_Alloc(&propertySpec) < 0) { - goto failure; + goto cleanup; } propertySpec->type = (char *)type; @@ -1423,7 +1413,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, propertySpec) < 0 || esxVI_ObjectSpec_AppendToList(&propertyFilterSpec->objectSet, objectSpec) < 0) { - goto failure; + goto cleanup; } result = esxVI_RetrieveProperties(ctx, propertyFilterSpec, @@ -1447,11 +1437,6 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, esxVI_PropertyFilterSpec_Free(&propertyFilterSpec); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1642,19 +1627,20 @@ esxVI_LookupNumberOfDomainsByPowerState(esxVI_Context *ctx, esxVI_VirtualMachinePowerState powerState, esxVI_Boolean inverse) { + bool success = false; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachineList = NULL; esxVI_ObjectContent *virtualMachine = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; esxVI_VirtualMachinePowerState powerState_; - int numberOfDomains = 0; + int count = 0; if (esxVI_String_AppendValueToList(&propertyNameList, "runtime.powerState") < 0 || esxVI_LookupObjectContentByType(ctx, ctx->vmFolder, "VirtualMachine", propertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (virtualMachine = virtualMachineList; virtualMachine != NULL; @@ -1665,14 +1651,14 @@ esxVI_LookupNumberOfDomainsByPowerState(esxVI_Context *ctx, if (STREQ(dynamicProperty->name, "runtime.powerState")) { if (esxVI_VirtualMachinePowerState_CastFromAnyType (dynamicProperty->val, &powerState_) < 0) { - goto failure; + goto cleanup; } if ((inverse != esxVI_Boolean_True && powerState_ == powerState) || (inverse == esxVI_Boolean_True && powerState_ != powerState)) { - numberOfDomains++; + count++; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -1680,16 +1666,13 @@ esxVI_LookupNumberOfDomainsByPowerState(esxVI_Context *ctx, } } + success = true; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachineList); - return numberOfDomains; - - failure: - numberOfDomains = -1; - - goto cleanup; + return success ? count : -1; } @@ -1955,7 +1938,7 @@ esxVI_LookupResourcePoolByHostSystem (esxVI_Context *ctx, esxVI_ObjectContent *hostSystem, esxVI_ManagedObjectReference **resourcePool) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; esxVI_ManagedObjectReference *managedObjectReference = NULL; @@ -1971,7 +1954,7 @@ esxVI_LookupResourcePoolByHostSystem if (STREQ(dynamicProperty->name, "parent")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, &managedObjectReference) < 0) { - goto failure; + goto cleanup; } break; @@ -1983,7 +1966,7 @@ esxVI_LookupResourcePoolByHostSystem if (managedObjectReference == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve compute resource of host system")); - goto failure; + goto cleanup; } if (esxVI_String_AppendValueToList(&propertyNameList, "resourcePool") < 0 || @@ -1991,13 +1974,13 @@ esxVI_LookupResourcePoolByHostSystem "ComputeResource", propertyNameList, esxVI_Boolean_False, &computeResource) < 0) { - goto failure; + goto cleanup; } if (computeResource == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve compute resource of host system")); - goto failure; + goto cleanup; } for (dynamicProperty = computeResource->propSet; dynamicProperty != NULL; @@ -2005,7 +1988,7 @@ esxVI_LookupResourcePoolByHostSystem if (STREQ(dynamicProperty->name, "resourcePool")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, resourcePool) < 0) { - goto failure; + goto cleanup; } break; @@ -2017,20 +2000,17 @@ esxVI_LookupResourcePoolByHostSystem if ((*resourcePool) == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve resource pool of compute resource")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&managedObjectReference); esxVI_ObjectContent_Free(&computeResource); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2040,7 +2020,7 @@ esxVI_LookupHostSystemByIp(esxVI_Context *ctx, const char *ipAddress, esxVI_String *propertyNameList, esxVI_ObjectContent **hostSystem) { - int result = 0; + int result = -1; esxVI_ManagedObjectReference *managedObjectReference = NULL; if (hostSystem == NULL || *hostSystem != NULL) { @@ -2050,31 +2030,28 @@ esxVI_LookupHostSystemByIp(esxVI_Context *ctx, const char *ipAddress, if (esxVI_FindByIp(ctx, ctx->datacenter, ipAddress, esxVI_Boolean_False, &managedObjectReference) < 0) { - goto failure; + return -1; } if (managedObjectReference == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not find host system with IP address '%s'"), ipAddress); - goto failure; + goto cleanup; } if (esxVI_LookupObjectContentByType(ctx, managedObjectReference, "HostSystem", propertyNameList, esxVI_Boolean_False, hostSystem) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ManagedObjectReference_Free(&managedObjectReference); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2085,7 +2062,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, esxVI_ObjectContent **virtualMachine, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_ManagedObjectReference *managedObjectReference = NULL; char uuid_string[VIR_UUID_STRING_BUFLEN] = ""; @@ -2098,7 +2075,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, if (esxVI_FindByUuid(ctx, ctx->datacenter, uuid_string, esxVI_Boolean_True, &managedObjectReference) < 0) { - goto failure; + return -1; } if (managedObjectReference == NULL) { @@ -2108,7 +2085,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, ESX_VI_ERROR(VIR_ERR_NO_DOMAIN, _("Could not find domain with UUID '%s'"), uuid_string); - goto failure; + goto cleanup; } } @@ -2116,18 +2093,15 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, "VirtualMachine", propertyNameList, esxVI_Boolean_False, virtualMachine) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ManagedObjectReference_Free(&managedObjectReference); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2138,7 +2112,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, esxVI_ObjectContent **virtualMachine, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_String *completePropertyNameList = NULL; esxVI_ObjectContent *virtualMachineList = NULL; esxVI_ObjectContent *candidate = NULL; @@ -2156,7 +2130,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, completePropertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (candidate = virtualMachineList; candidate != NULL; @@ -2165,7 +2139,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, if (esxVI_GetVirtualMachineIdentity(candidate, NULL, &name_candidate, NULL) < 0) { - goto failure; + goto cleanup; } if (STRNEQ(name, name_candidate)) { @@ -2173,7 +2147,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, } if (esxVI_ObjectContent_DeepCopy(virtualMachine, candidate) < 0) { - goto failure; + goto cleanup; } break; @@ -2185,21 +2159,18 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, } else { ESX_VI_ERROR(VIR_ERR_NO_DOMAIN, _("Could not find domain with name '%s'"), name); - goto failure; + goto cleanup; } } + result = 0; + cleanup: esxVI_String_Free(&completePropertyNameList); esxVI_ObjectContent_Free(&virtualMachineList); VIR_FREE(name_candidate); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2210,7 +2181,7 @@ esxVI_LookupVirtualMachineByUuidAndPrepareForTask esxVI_String *propertyNameList, esxVI_ObjectContent **virtualMachine, esxVI_Boolean autoAnswer) { - int result = 0; + int result = -1; esxVI_String *completePropertyNameList = NULL; esxVI_VirtualMachineQuestionInfo *questionInfo = NULL; esxVI_TaskInfo *pendingTaskInfoList = NULL; @@ -2227,32 +2198,29 @@ esxVI_LookupVirtualMachineByUuidAndPrepareForTask &questionInfo) < 0 || esxVI_LookupPendingTaskInfoListByVirtualMachine (ctx, *virtualMachine, &pendingTaskInfoList) < 0) { - goto failure; + goto cleanup; } if (questionInfo != NULL && esxVI_HandleVirtualMachineQuestion(ctx, (*virtualMachine)->obj, questionInfo, autoAnswer) < 0) { - goto failure; + goto cleanup; } if (pendingTaskInfoList != NULL) { ESX_VI_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Other tasks are pending for this domain")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&completePropertyNameList); esxVI_VirtualMachineQuestionInfo_Free(&questionInfo); esxVI_TaskInfo_Free(&pendingTaskInfoList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2263,7 +2231,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, esxVI_ObjectContent **datastore, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_String *completePropertyNameList = NULL; esxVI_ObjectContent *datastoreList = NULL; esxVI_ObjectContent *candidate = NULL; @@ -2284,23 +2252,23 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, "summary.accessible\0" "summary.name\0" "summary.url\0") < 0) { - goto failure; + goto cleanup; } if (esxVI_LookupObjectContentByType(ctx, ctx->datacenter, "Datastore", completePropertyNameList, esxVI_Boolean_True, &datastoreList) < 0) { - goto failure; + goto cleanup; } if (datastoreList == NULL) { if (occurrence == esxVI_Occurrence_OptionalItem) { - goto cleanup; + goto success; } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("No datastores available")); - goto failure; + goto cleanup; } } @@ -2314,7 +2282,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, if (STREQ(dynamicProperty->name, "summary.accessible")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Boolean) < 0) { - goto failure; + goto cleanup; } accessible = dynamicProperty->val->boolean; @@ -2326,7 +2294,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Got incomplete response while querying for the " "datastore 'summary.accessible' property")); - goto failure; + goto cleanup; } if (accessible == esxVI_Boolean_False) { @@ -2338,17 +2306,17 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, if (STREQ(dynamicProperty->name, "summary.name")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } if (STREQ(dynamicProperty->val->string, name)) { if (esxVI_ObjectContent_DeepCopy(datastore, candidate) < 0) { - goto failure; + goto cleanup; } /* Found datastore with matching name */ - goto cleanup; + goto success; } } else if (STREQ(dynamicProperty->name, "summary.url") && ctx->productVersion & esxVI_ProductVersion_ESX) { @@ -2362,7 +2330,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } if (! STRPREFIX(dynamicProperty->val->string, @@ -2371,17 +2339,17 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, _("Datastore URL '%s' has unexpected prefix, " "expecting '/vmfs/volumes/' prefix"), dynamicProperty->val->string); - goto failure; + goto cleanup; } if (STREQ(dynamicProperty->val->string + offset, name)) { if (esxVI_ObjectContent_DeepCopy(datastore, candidate) < 0) { - goto failure; + goto cleanup; } /* Found datastore with matching URL suffix */ - goto cleanup; + goto success; } } } @@ -2397,19 +2365,17 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, _("Could not find datastore '%s'"), name); } - goto failure; + goto cleanup; } + success: + result = 0; + cleanup: esxVI_String_Free(&completePropertyNameList); esxVI_ObjectContent_Free(&datastoreList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2419,7 +2385,7 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, esxVI_ManagedObjectReference *task, esxVI_TaskInfo **taskInfo) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *objectContent = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -2433,7 +2399,7 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, esxVI_LookupObjectContentByType(ctx, task, "Task", propertyNameList, esxVI_Boolean_False, &objectContent) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = objectContent->propSet; dynamicProperty != NULL; @@ -2441,7 +2407,7 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, if (STREQ(dynamicProperty->name, "info")) { if (esxVI_TaskInfo_CastFromAnyType(dynamicProperty->val, taskInfo) < 0) { - goto failure; + goto cleanup; } break; @@ -2450,16 +2416,13 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, } } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&objectContent); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2469,7 +2432,7 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine (esxVI_Context *ctx, esxVI_ObjectContent *virtualMachine, esxVI_TaskInfo **pendingTaskInfoList) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ManagedObjectReference *recentTaskList = NULL; esxVI_ManagedObjectReference *recentTask = NULL; @@ -2487,7 +2450,7 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine if (STREQ(dynamicProperty->name, "recentTask")) { if (esxVI_ManagedObjectReference_CastListFromAnyType (dynamicProperty->val, &recentTaskList) < 0) { - goto failure; + goto cleanup; } break; @@ -2498,14 +2461,14 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine for (recentTask = recentTaskList; recentTask != NULL; recentTask = recentTask->_next) { if (esxVI_LookupTaskInfoByTask(ctx, recentTask, &taskInfo) < 0) { - goto failure; + goto cleanup; } if (taskInfo->state == esxVI_TaskInfoState_Queued || taskInfo->state == esxVI_TaskInfoState_Running) { if (esxVI_TaskInfo_AppendToList(pendingTaskInfoList, taskInfo) < 0) { - goto failure; + goto cleanup; } taskInfo = NULL; @@ -2514,19 +2477,18 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine } } + result = 0; + cleanup: + if (result < 0) { + esxVI_TaskInfo_Free(pendingTaskInfoList); + } + esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&recentTaskList); esxVI_TaskInfo_Free(&taskInfo); return result; - - failure: - esxVI_TaskInfo_Free(pendingTaskInfoList); - - result = -1; - - goto cleanup; } @@ -2536,7 +2498,7 @@ esxVI_LookupAndHandleVirtualMachineQuestion(esxVI_Context *ctx, const unsigned char *uuid, esxVI_Boolean autoAnswer) { - int result = 0; + int result = -1; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; esxVI_VirtualMachineQuestionInfo *questionInfo = NULL; @@ -2548,26 +2510,23 @@ esxVI_LookupAndHandleVirtualMachineQuestion(esxVI_Context *ctx, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachineQuestionInfo(virtualMachine, &questionInfo) < 0) { - goto failure; + goto cleanup; } if (questionInfo != NULL && esxVI_HandleVirtualMachineQuestion(ctx, virtualMachine->obj, questionInfo, autoAnswer) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); esxVI_VirtualMachineQuestionInfo_Free(&questionInfo); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2577,7 +2536,7 @@ esxVI_LookupRootSnapshotTreeList (esxVI_Context *ctx, const unsigned char *virtualMachineUuid, esxVI_VirtualMachineSnapshotTree **rootSnapshotTreeList) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -2592,7 +2551,7 @@ esxVI_LookupRootSnapshotTreeList esxVI_LookupVirtualMachineByUuid(ctx, virtualMachineUuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; @@ -2600,7 +2559,7 @@ esxVI_LookupRootSnapshotTreeList if (STREQ(dynamicProperty->name, "snapshot.rootSnapshotList")) { if (esxVI_VirtualMachineSnapshotTree_CastListFromAnyType (dynamicProperty->val, rootSnapshotTreeList) < 0) { - goto failure; + goto cleanup; } break; @@ -2609,18 +2568,17 @@ esxVI_LookupRootSnapshotTreeList } } + result = 0; + cleanup: + if (result < 0) { + esxVI_VirtualMachineSnapshotTree_Free(rootSnapshotTreeList); + } + esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); return result; - - failure: - esxVI_VirtualMachineSnapshotTree_Free(rootSnapshotTreeList); - - result = -1; - - goto cleanup; } @@ -2631,7 +2589,7 @@ esxVI_LookupCurrentSnapshotTree esxVI_VirtualMachineSnapshotTree **currentSnapshotTree, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -2650,7 +2608,7 @@ esxVI_LookupCurrentSnapshotTree esxVI_LookupVirtualMachineByUuid(ctx, virtualMachineUuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; @@ -2658,12 +2616,12 @@ esxVI_LookupCurrentSnapshotTree if (STREQ(dynamicProperty->name, "snapshot.currentSnapshot")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, ¤tSnapshot) < 0) { - goto failure; + goto cleanup; } } else if (STREQ(dynamicProperty->name, "snapshot.rootSnapshotList")) { if (esxVI_VirtualMachineSnapshotTree_CastListFromAnyType (dynamicProperty->val, &rootSnapshotTreeList) < 0) { - goto failure; + goto cleanup; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -2676,23 +2634,25 @@ esxVI_LookupCurrentSnapshotTree } else { ESX_VI_ERROR(VIR_ERR_NO_DOMAIN_SNAPSHOT, "%s", _("Domain has no current snapshot")); - goto failure; + goto cleanup; } } if (rootSnapshotTreeList == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not lookup root snapshot list")); - goto failure; + goto cleanup; } if (esxVI_GetSnapshotTreeBySnapshot(rootSnapshotTreeList, currentSnapshot, &snapshotTree) < 0 || esxVI_VirtualMachineSnapshotTree_DeepCopy(currentSnapshotTree, snapshotTree) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); @@ -2700,11 +2660,6 @@ esxVI_LookupCurrentSnapshotTree esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2715,7 +2670,7 @@ esxVI_HandleVirtualMachineQuestion esxVI_VirtualMachineQuestionInfo *questionInfo, esxVI_Boolean autoAnswer) { - int result = 0; + int result = -1; esxVI_ElementDescription *elementDescription = NULL; virBuffer buffer = VIR_BUFFER_INITIALIZER; esxVI_ElementDescription *answerChoice = NULL; @@ -2743,7 +2698,7 @@ esxVI_HandleVirtualMachineQuestion if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } possibleAnswers = virBufferContentAndReset(&buffer); @@ -2755,14 +2710,14 @@ esxVI_HandleVirtualMachineQuestion _("Pending question blocks virtual machine execution, " "question is '%s', no possible answers"), questionInfo->text); - goto failure; + goto cleanup; } else if (answerChoice == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Pending question blocks virtual machine execution, " "question is '%s', possible answers are %s, but no " "default answer is specified"), questionInfo->text, possibleAnswers); - goto failure; + goto cleanup; } VIR_INFO("Pending question blocks virtual machine execution, " @@ -2772,7 +2727,7 @@ esxVI_HandleVirtualMachineQuestion if (esxVI_AnswerVM(ctx, virtualMachine, questionInfo->id, answerChoice->key) < 0) { - goto failure; + goto cleanup; } } else { if (possibleAnswers != NULL) { @@ -2787,20 +2742,19 @@ esxVI_HandleVirtualMachineQuestion questionInfo->text); } - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virBufferFreeAndReset(&buffer); + } + VIR_FREE(possibleAnswers); return result; - - failure: - virBufferFreeAndReset(&buffer); - - result = -1; - - goto cleanup; } @@ -2812,7 +2766,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, esxVI_Boolean autoAnswer, esxVI_TaskInfoState *finalState) { - int result = 0; + int result = -1; esxVI_ObjectSpec *objectSpec = NULL; esxVI_PropertySpec *propertySpec = NULL; esxVI_PropertyFilterSpec *propertyFilterSpec = NULL; @@ -2830,18 +2784,18 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, if (version == NULL) { virReportOOMError(); - goto failure; + return -1; } if (esxVI_ObjectSpec_Alloc(&objectSpec) < 0) { - goto failure; + goto cleanup; } objectSpec->obj = task; objectSpec->skip = esxVI_Boolean_False; if (esxVI_PropertySpec_Alloc(&propertySpec) < 0) { - goto failure; + goto cleanup; } propertySpec->type = task->type; @@ -2855,7 +2809,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, objectSpec) < 0 || esxVI_CreateFilter(ctx, propertyFilterSpec, esxVI_Boolean_True, &propertyFilter) < 0) { - goto failure; + goto cleanup; } while (state != esxVI_TaskInfoState_Success && @@ -2871,7 +2825,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, * don't overwrite the actual error */ if (esxVI_LookupTaskInfoByTask(ctx, task, &taskInfo)) { - goto failure; + goto cleanup; } if (taskInfo->cancelable == esxVI_Boolean_True) { @@ -2887,12 +2841,12 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, /* FIXME: Enable error reporting here again */ - goto failure; + goto cleanup; } } if (esxVI_WaitForUpdates(ctx, version, &updateSet) < 0) { - goto failure; + goto cleanup; } VIR_FREE(version); @@ -2900,7 +2854,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, if (version == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } if (updateSet->filterSet == NULL) { @@ -2932,7 +2886,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, } if (esxVI_TaskInfoState_CastFromAnyType(propertyValue, &state) < 0) { - goto failure; + goto cleanup; } } @@ -2941,9 +2895,11 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, } if (esxVI_TaskInfoState_CastFromAnyType(propertyValue, finalState) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: /* * Remove values given by the caller from the data structures to prevent @@ -2964,11 +2920,6 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, esxVI_TaskInfo_Free(&taskInfo); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2994,7 +2945,7 @@ esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HostCpuIdInfo register '%s' has an unexpected length"), name[r]); - goto failure; + return -1; } /* Strip the ':' and invert the "bit" order from 31..0 to 0..31 */ @@ -3008,15 +2959,10 @@ esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HostCpuIdInfo register '%s' has an unexpected format"), name[r]); - goto failure; + return -1; } } } return 0; - - failure: - memset(parsedHostCpuIdInfo, 0, sizeof (*parsedHostCpuIdInfo)); - - return -1; } diff --git a/src/esx/esx_vi_methods.c b/src/esx/esx_vi_methods.c index 8f841e3..56d2e58 100644 --- a/src/esx/esx_vi_methods.c +++ b/src/esx/esx_vi_methods.c @@ -74,14 +74,14 @@ #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredItem(_type) \ if (esxVI_##_type##_Deserialize(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredList(_type) \ if (esxVI_##_type##_DeserializeList(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -89,7 +89,7 @@ #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalItem(_type) \ if (response->node != NULL && \ esxVI_##_type##_Deserialize(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -97,7 +97,7 @@ #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalList(_type) \ if (response->node != NULL && \ esxVI_##_type##_DeserializeList(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -107,7 +107,7 @@ int \ esxVI_##_name _parameters \ { \ - int result = 0; \ + int result = -1; \ const char *methodName = #_name; \ virBuffer buffer = VIR_BUFFER_INITIALIZER; \ char *request = NULL; \ @@ -129,30 +129,29 @@ \ if (virBufferError(&buffer)) { \ virReportOOMError(); \ - goto failure; \ + goto cleanup; \ } \ \ request = virBufferContentAndReset(&buffer); \ \ if (esxVI_Context_Execute(ctx, methodName, request, &response, \ esxVI_Occurrence_##_occurrence) < 0) { \ - goto failure; \ + goto cleanup; \ } \ \ ESX_VI__METHOD__DESERIALIZE_OUTPUT__##_occurrence(_output_type) \ \ + result = 0; \ + \ cleanup: \ + if (result < 0) { \ + virBufferFreeAndReset(&buffer); \ + } \ + \ VIR_FREE(request); \ esxVI_Response_Free(&response); \ \ return result; \ - \ - failure: \ - virBufferFreeAndReset(&buffer); \ - \ - result = -1; \ - \ - goto cleanup; \ } @@ -216,21 +215,21 @@ #define ESX_VI__METHOD__PARAMETER__SERIALIZE(_type, _name) \ if (esxVI_##_type##_Serialize(_name, #_name, &buffer) < 0) { \ - goto failure; \ + goto cleanup; \ } #define ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(_type, _name) \ if (esxVI_##_type##_SerializeList(_name, #_name, &buffer) < 0) { \ - goto failure; \ + goto cleanup; \ } #define ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(_type, _name) \ if (esxVI_##_type##_SerializeValue(_name, #_name, &buffer) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -243,7 +242,7 @@ int esxVI_RetrieveServiceContent(esxVI_Context *ctx, esxVI_ServiceContent **serviceContent) { - int result = 0; + int result = -1; const char *request = ESX_VI__SOAP__REQUEST_HEADER "<RetrieveServiceContent xmlns=\"urn:vim25\">" "<_this xmlns=\"urn:vim25\" " @@ -263,18 +262,15 @@ esxVI_RetrieveServiceContent(esxVI_Context *ctx, if (esxVI_Context_Execute(ctx, "RetrieveServiceContent", request, &response, esxVI_Occurrence_RequiredItem) < 0 || esxVI_ServiceContent_Deserialize(response->node, serviceContent) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_Response_Free(&response); return result; - - failure: - result = -1; - - goto cleanup; } diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c index 8334efd..3f34fee 100644 --- a/src/esx/esx_vi_types.c +++ b/src/esx/esx_vi_types.c @@ -297,7 +297,7 @@ int \ esxVI_##_type##_Deserialize(xmlNodePtr node, esxVI_##_type **number) \ { \ - int result = 0; \ + int result = -1; \ char *string; \ long long value; \ \ @@ -317,35 +317,34 @@ ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \ "XML node doesn't contain text, expecting an " \ _xsdType" value"); \ - goto failure; \ + goto cleanup; \ } \ \ if (virStrToLong_ll(string, NULL, 10, &value) < 0) { \ ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \ "Unknown value '%s' for "_xsdType, string); \ - goto failure; \ + goto cleanup; \ } \ \ if (value < (_min) || value > (_max)) { \ ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \ "Value '%s' is not representable as "_xsdType, \ (const char *)string); \ - goto failure; \ + goto cleanup; \ } \ \ (*number)->value = value; \ \ + result = 0; \ + \ cleanup: \ + if (result < 0) { \ + esxVI_##_type##_Free(number); \ + } \ + \ VIR_FREE(string); \ \ return result; \ - \ - failure: \ - esxVI_##_type##_Free(number); \ - \ - result = -1; \ - \ - goto cleanup; \ } @@ -930,7 +929,7 @@ esxVI_String_AppendValueToList(esxVI_String **stringList, const char *value) esxVI_String *string = NULL; if (esxVI_String_Alloc(&string) < 0) { - goto failure; + return -1; } string->value = strdup(value); diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c index 142f2f7..c09989b 100644 --- a/src/esx/esx_vmx.c +++ b/src/esx/esx_vmx.c @@ -590,6 +590,7 @@ char * esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, const char *absolutePath) { + bool success = false; char *copyOfAbsolutePath = NULL; char *tmp = NULL; char *saveptr = NULL; @@ -601,7 +602,7 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, const char *datastoreName = NULL; if (esxVI_String_DeepCopyValue(©OfAbsolutePath, absolutePath) < 0) { - goto failure; + return NULL; } /* Expected format: '/vmfs/volumes/<datastore>/<path>' */ @@ -611,14 +612,14 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Absolute path '%s' doesn't have expected format " "'/vmfs/volumes/<datastore>/<path>'"), absolutePath); - goto failure; + goto cleanup; } if (ctx != NULL) { if (esxVI_LookupDatastoreByName(ctx, preliminaryDatastoreName, NULL, &datastore, esxVI_Occurrence_OptionalItem) < 0) { - goto failure; + goto cleanup; } if (datastore != NULL) { @@ -629,7 +630,7 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, } else if (STREQ(dynamicProperty->name, "summary.name")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } datastoreName = dynamicProperty->val->string; @@ -656,21 +657,22 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, if (virAsprintf(&datastoreRelatedPath, "[%s] %s", datastoreName, directoryAndFileName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } /* FIXME: Check if referenced path/file really exists */ + success = true; + cleanup: + if (! success) { + VIR_FREE(datastoreRelatedPath); + } + VIR_FREE(copyOfAbsolutePath); esxVI_ObjectContent_Free(&datastore); return datastoreRelatedPath; - - failure: - VIR_FREE(datastoreRelatedPath); - - goto cleanup; } @@ -727,6 +729,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, const char *datastoreName, const char *directoryName, esxVI_ProductVersion productVersion) { + bool success = false; virConfPtr conf = NULL; virDomainDefPtr def = NULL; long long config_version = 0; @@ -750,7 +753,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (VIR_ALLOC(def) < 0) { virReportOOMError(); - goto failure; + return NULL; } def->virtType = VIR_DOMAIN_VIRT_VMWARE; /* FIXME: maybe add VIR_DOMAIN_VIRT_ESX ? */ @@ -759,20 +762,20 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* vmx:config.version */ if (esxUtil_GetConfigLong(conf, "config.version", &config_version, 0, 0) < 0) { - goto failure; + goto cleanup; } if (config_version != 8) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry 'config.version' to be 8 but found " "%lld"), config_version); - goto failure; + goto cleanup; } /* vmx:virtualHW.version */ if (esxUtil_GetConfigLong(conf, "virtualHW.version", &virtualHW_version, 0, 0) < 0) { - goto failure; + goto cleanup; } /* @@ -790,7 +793,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'virtualHW.version' to be 4 " "but found %lld"), virtualHW_version); - goto failure; + goto cleanup; } break; @@ -802,7 +805,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'virtualHW.version' to be 4 or 7 " "but found %lld"), virtualHW_version); - goto failure; + goto cleanup; } break; @@ -810,37 +813,37 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, default: ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Unexpected product version")); - goto failure; + goto cleanup; } /* vmx:uuid.bios -> def:uuid */ /* FIXME: Need to handle 'uuid.action = "create"' */ if (esxUtil_GetConfigUUID(conf, "uuid.bios", def->uuid, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:displayName -> def:name */ if (esxUtil_GetConfigString(conf, "displayName", &def->name, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:memsize -> def:maxmem */ if (esxUtil_GetConfigLong(conf, "memsize", &memsize, 32, 1) < 0) { - goto failure; + goto cleanup; } if (memsize <= 0 || memsize % 4 != 0) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry 'memsize' to be an unsigned " "integer (multiple of 4) but found %lld"), memsize); - goto failure; + goto cleanup; } def->maxmem = memsize * 1024; /* Scale from megabytes to kilobytes */ /* vmx:sched.mem.max -> def:memory */ if (esxUtil_GetConfigLong(conf, "sched.mem.max", &memory, memsize, 1) < 0) { - goto failure; + goto cleanup; } if (memory < 0) { @@ -855,14 +858,14 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* vmx:numvcpus -> def:vcpus */ if (esxUtil_GetConfigLong(conf, "numvcpus", &numvcpus, 1, 1) < 0) { - goto failure; + goto cleanup; } if (numvcpus <= 0 || (numvcpus % 2 != 0 && numvcpus != 1)) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry 'numvcpus' to be an unsigned " "integer (1 or a multiple of 2) but found %lld"), numvcpus); - goto failure; + goto cleanup; } def->vcpus = numvcpus; @@ -871,7 +874,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, // VirtualMachine:config.cpuAffinity.affinitySet if (esxUtil_GetConfigString(conf, "sched.cpu.affinity", &sched_cpu_affinity, 1) < 0) { - goto failure; + goto cleanup; } if (sched_cpu_affinity != NULL && STRNEQ(sched_cpu_affinity, "all")) { @@ -882,7 +885,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (VIR_ALLOC_N(def->cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } while (*current != '\0') { @@ -895,14 +898,14 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'sched.cpu.affinity' to be " "a comma separated list of unsigned integers but " "found '%s'"), sched_cpu_affinity); - goto failure; + goto cleanup; } if (number >= VIR_DOMAIN_CPUMASK_LEN) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("VMX entry 'sched.cpu.affinity' contains a %d, " "this value is too large"), number); - goto failure; + goto cleanup; } if (number + 1 > def->cpumasklen) { @@ -923,7 +926,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'sched.cpu.affinity' to be " "a comma separated list of unsigned integers but " "found '%s'"), sched_cpu_affinity); - goto failure; + goto cleanup; } virSkipSpaces(¤t); @@ -934,7 +937,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'sched.cpu.affinity' to contain " "at least as many values as 'numvcpus' (%lld) but " "found only %d value(s)"), numvcpus, count); - goto failure; + goto cleanup; } } @@ -948,12 +951,12 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (def->os.type == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } /* vmx:guestOS -> def:os.arch */ if (esxUtil_GetConfigString(conf, "guestOS", &guestOS, 1) < 0) { - goto failure; + goto cleanup; } if (guestOS != NULL && virFileHasSuffix(guestOS, "-64")) { @@ -964,7 +967,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (def->os.arch == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } /* @@ -977,13 +980,13 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:graphics */ if (VIR_ALLOC_N(def->graphics, 1) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->ngraphics = 0; if (esxVMX_ParseVNC(conf, &def->graphics[def->ngraphics]) < 0) { - goto failure; + goto cleanup; } if (def->graphics[def->ngraphics] != NULL) { @@ -993,7 +996,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:disks: 4 * 15 scsi + 2 * 2 ide + 2 floppy = 66 */ if (VIR_ALLOC_N(def->disks, 66) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->ndisks = 0; @@ -1004,7 +1007,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (esxVMX_ParseSCSIController(conf, controller, &present, &scsi_virtualDev) < 0) { - goto failure; + goto cleanup; } if (! present) { @@ -1024,7 +1027,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_SCSI, controller, id, scsi_virtualDev, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1036,7 +1039,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_SCSI, controller, id, scsi_virtualDev, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1052,7 +1055,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_IDE, controller, id, NULL, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1064,7 +1067,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_IDE, controller, id, NULL, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1079,7 +1082,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_FDC, controller, -1, NULL, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1093,7 +1096,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:nets */ if (VIR_ALLOC_N(def->nets, 4) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->nnets = 0; @@ -1101,7 +1104,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, for (controller = 0; controller < 4; ++controller) { if (esxVMX_ParseEthernet(conf, controller, &def->nets[def->nnets]) < 0) { - goto failure; + goto cleanup; } if (def->nets[def->nnets] != NULL) { @@ -1121,7 +1124,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:serials */ if (VIR_ALLOC_N(def->serials, 4) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->nserials = 0; @@ -1130,7 +1133,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (esxVMX_ParseSerial(ctx, conf, port, datastoreName, directoryName, &def->serials[def->nserials]) < 0) { - goto failure; + goto cleanup; } if (def->serials[def->nserials] != NULL) { @@ -1141,7 +1144,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:parallels */ if (VIR_ALLOC_N(def->parallels, 3) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->nparallels = 0; @@ -1150,7 +1153,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (esxVMX_ParseParallel(ctx, conf, port, datastoreName, directoryName, &def->parallels[def->nparallels]) < 0) { - goto failure; + goto cleanup; } if (def->parallels[def->nparallels] != NULL) { @@ -1158,19 +1161,20 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, } } + success = true; + cleanup: + if (! success) { + virDomainDefFree(def); + def = NULL; + } + virConfFree(conf); VIR_FREE(sched_cpu_affinity); VIR_FREE(guestOS); VIR_FREE(scsi_virtualDev); return def; - - failure: - virDomainDefFree(def); - def = NULL; - - goto cleanup; } @@ -1335,7 +1339,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, * virtualDev = NULL */ - int result = 0; + int result = -1; char *prefix = NULL; char present_name[32] = ""; @@ -1366,7 +1370,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } (*def)->device = device; @@ -1380,18 +1384,18 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("SCSI controller index %d out of [0..3] range"), controller); - goto failure; + goto cleanup; } if (id < 0 || id > 15 || id == 7) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("SCSI ID %d out of [0..6,8..15] range"), id); - goto failure; + goto cleanup; } if (virAsprintf(&prefix, "scsi%d:%d", controller, id) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } (*def)->dst = @@ -1399,7 +1403,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, (controller * 15 + (id < 7 ? id : id - 1), "sd"); if ((*def)->dst == NULL) { - goto failure; + goto cleanup; } if (virtualDev != NULL) { @@ -1407,7 +1411,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, if ((*def)->driverName == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } } else if (bus == VIR_DOMAIN_DISK_BUS_IDE) { @@ -1415,31 +1419,31 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("IDE controller index %d out of [0..1] range"), controller); - goto failure; + goto cleanup; } if (id < 0 || id > 1) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("IDE ID %d out of [0..1] range"), id); - goto failure; + goto cleanup; } if (virAsprintf(&prefix, "ide%d:%d", controller, id) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } (*def)->dst = virIndexToDiskName(controller * 2 + id, "hd"); if ((*def)->dst == NULL) { - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported bus type '%s' for device type '%s'"), virDomainDiskBusTypeToString(bus), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } } else if (device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { if (bus == VIR_DOMAIN_DISK_BUS_FDC) { @@ -1447,31 +1451,31 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Floppy controller index %d out of [0..1] range"), controller); - goto failure; + goto cleanup; } if (virAsprintf(&prefix, "floppy%d", controller) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } (*def)->dst = virIndexToDiskName(controller, "fd"); if ((*def)->dst == NULL) { - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported bus type '%s' for device type '%s'"), virDomainDiskBusTypeToString(bus), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported device type '%s'"), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } ESX_BUILD_VMX_NAME(present); @@ -1484,13 +1488,13 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -1500,13 +1504,13 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, /* vmx:deviceType -> def:type */ if (esxUtil_GetConfigString(conf, deviceType_name, &deviceType, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:clientDevice */ if (esxUtil_GetConfigBoolean(conf, clientDevice_name, &clientDevice, 0, 1) < 0) { - goto failure; + goto cleanup; } if (clientDevice) { @@ -1519,18 +1523,18 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, /* vmx:fileType -> def:type */ if (esxUtil_GetConfigString(conf, fileType_name, &fileType, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:fileName -> def:src, def:type */ if (esxUtil_GetConfigString(conf, fileName_name, &fileName, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:writeThrough -> def:cachemode */ if (esxUtil_GetConfigBoolean(conf, writeThrough_name, &writeThrough, 0, 1) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainDiskDef */ @@ -1542,13 +1546,13 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'scsi-hardDisk' " "but found '%s'"), deviceType_name, deviceType); - goto failure; + goto cleanup; } else if (bus == VIR_DOMAIN_DISK_BUS_IDE && STRCASENEQ(deviceType, "ata-hardDisk")) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'ata-hardDisk' " "but found '%s'"), deviceType_name, deviceType); - goto failure; + goto cleanup; } } @@ -1569,7 +1573,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, : VIR_DOMAIN_DISK_CACHE_DEFAULT; if ((*def)->src == NULL) { - goto failure; + goto cleanup; } } else if (virFileHasSuffix(fileName, ".iso") || STREQ(deviceType, "atapi-cdrom")) { @@ -1584,7 +1588,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' for VMX entry " "'%s'"), fileName, fileName_name); - goto failure; + goto cleanup; } } else if (device == VIR_DOMAIN_DISK_DEVICE_CDROM) { if (virFileHasSuffix(fileName, ".iso")) { @@ -1593,7 +1597,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'cdrom-image' " "but found '%s'"), deviceType_name, deviceType); - goto failure; + goto cleanup; } } @@ -1602,7 +1606,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, directoryName); if ((*def)->src == NULL) { - goto failure; + goto cleanup; } } else if (virFileHasSuffix(fileName, ".vmdk")) { /* @@ -1621,7 +1625,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' for VMX entry " "'%s'"), fileName, fileName_name); - goto failure; + goto cleanup; } } else if (device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { if (virFileHasSuffix(fileName, ".flp")) { @@ -1630,7 +1634,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'file' but " "found '%s'"), fileType_name, fileType); - goto failure; + goto cleanup; } } @@ -1639,7 +1643,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, directoryName); if ((*def)->src == NULL) { - goto failure; + goto cleanup; } } else if (fileType != NULL && STREQ(fileType, "device")) { (*def)->type = VIR_DOMAIN_DISK_TYPE_BLOCK; @@ -1650,14 +1654,16 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' for VMX entry " "'%s'"), fileName, fileName_name); - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported device type '%s'"), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } + result = 0; + cleanup: VIR_FREE(prefix); VIR_FREE(deviceType); @@ -1666,13 +1672,12 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, return result; - failure: - result = -1; - ignore: virDomainDiskDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -1681,7 +1686,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, int esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) { - int result = 0; + int result = -1; char prefix[48] = ""; char present_name[48] = ""; @@ -1728,7 +1733,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } snprintf(prefix, sizeof(prefix), "ethernet%d", controller); @@ -1746,13 +1751,13 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -1763,7 +1768,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) /* vmx:connectionType -> def:type */ if (esxUtil_GetConfigString(conf, connectionType_name, &connectionType, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:addressType, vmx:generatedAddress, vmx:address -> def:mac */ @@ -1771,7 +1776,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) esxUtil_GetConfigString(conf, generatedAddress_name, &generatedAddress, 1) < 0 || esxUtil_GetConfigString(conf, address_name, &address, 1) < 0) { - goto failure; + goto cleanup; } if (addressType == NULL || STRCASEEQ(addressType, "generated") || @@ -1782,7 +1787,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) _("Expecting VMX entry '%s' to be MAC address but " "found '%s'"), generatedAddress_name, generatedAddress); - goto failure; + goto cleanup; } } } else if (STRCASEEQ(addressType, "static")) { @@ -1791,20 +1796,20 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be MAC address but " "found '%s'"), address_name, address); - goto failure; + goto cleanup; } } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'generated' or 'static' or " "'vpx' but found '%s'"), addressType_name, addressType); - goto failure; + goto cleanup; } /* vmx:virtualDev, vmx:features -> def:model */ if (esxUtil_GetConfigString(conf, virtualDev_name, &virtualDev, 1) < 0 || esxUtil_GetConfigLong(conf, features_name, &features, 0, 1) < 0) { - goto failure; + goto cleanup; } if (virtualDev != NULL) { @@ -1816,7 +1821,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) _("Expecting VMX entry '%s' to be 'vlance' or 'vmxnet' or " "'vmxnet3' or 'e1000' but found '%s'"), virtualDev_name, virtualDev); - goto failure; + goto cleanup; } if (STRCASEEQ(virtualDev, "vmxnet") && features == 15) { @@ -1826,7 +1831,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) if (virtualDev == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } } @@ -1836,13 +1841,13 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) STRCASEEQ(connectionType, "bridged") || STRCASEEQ(connectionType, "custom")) && esxUtil_GetConfigString(conf, networkName_name, &networkName, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:vnet -> def:data.ifname */ if (connectionType != NULL && STRCASEEQ(connectionType, "custom") && esxUtil_GetConfigString(conf, vnet_name, &vnet, 0) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainNetDef */ @@ -1858,13 +1863,13 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("No yet handled value '%s' for VMX entry '%s'"), connectionType, connectionType_name); - goto failure; + goto cleanup; } else if (STRCASEEQ(connectionType, "nat")) { /* FIXME */ ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("No yet handled value '%s' for VMX entry '%s'"), connectionType, connectionType_name); - goto failure; + goto cleanup; } else if (STRCASEEQ(connectionType, "custom")) { (*def)->type = VIR_DOMAIN_NET_TYPE_BRIDGE; (*def)->model = virtualDev; @@ -1878,9 +1883,11 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid value '%s' for VMX entry '%s'"), connectionType, connectionType_name); - goto failure; + goto cleanup; } + result = 0; + cleanup: VIR_FREE(connectionType); VIR_FREE(addressType); @@ -1891,13 +1898,12 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) return result; - failure: - result = -1; - ignore: virDomainNetDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -1908,7 +1914,7 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, const char *datastoreName, const char *directoryName, virDomainChrDefPtr *def) { - int result = 0; + int result = -1; char prefix[48] = ""; char present_name[48] = ""; @@ -1936,7 +1942,7 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } (*def)->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL; @@ -1950,13 +1956,13 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -1966,12 +1972,12 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:fileType -> def:type */ if (esxUtil_GetConfigString(conf, fileType_name, &fileType, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:fileName -> def:data.file.path */ if (esxUtil_GetConfigString(conf, fileName_name, &fileName, 0) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainChrDef */ @@ -1989,7 +1995,7 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, directoryName); if ((*def)->data.file.path == NULL) { - goto failure; + goto cleanup; } } else if (STRCASEEQ(fileType, "pipe")) { /* @@ -2005,22 +2011,23 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'device', 'file' or 'pipe' " "but found '%s'"), fileType_name, fileType); - goto failure; + goto cleanup; } + result = 0; + cleanup: VIR_FREE(fileType); VIR_FREE(fileName); return result; - failure: - result = -1; - ignore: virDomainChrDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -2031,7 +2038,7 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, const char *datastoreName, const char *directoryName, virDomainChrDefPtr *def) { - int result = 0; + int result = -1; char prefix[48] = ""; char present_name[48] = ""; @@ -2059,7 +2066,7 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } (*def)->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL; @@ -2073,13 +2080,13 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -2089,12 +2096,12 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:fileType -> def:type */ if (esxUtil_GetConfigString(conf, fileType_name, &fileType, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:fileName -> def:data.file.path */ if (esxUtil_GetConfigString(conf, fileName_name, &fileName, 0) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainChrDef */ @@ -2112,28 +2119,29 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, directoryName); if ((*def)->data.file.path == NULL) { - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'device' or 'file' but " "found '%s'"), fileType_name, fileType); - goto failure; + goto cleanup; } + result = 0; + cleanup: VIR_FREE(fileType); VIR_FREE(fileName); return result; - failure: - result = -1; - ignore: virDomainChrDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -2146,6 +2154,7 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, char * esxVMX_FormatFileName(esxVI_Context *ctx ATTRIBUTE_UNUSED, const char *src) { + bool success = false; char *datastoreName = NULL; char *directoryName = NULL; char *fileName = NULL; @@ -2155,20 +2164,20 @@ esxVMX_FormatFileName(esxVI_Context *ctx ATTRIBUTE_UNUSED, const char *src) /* Found potential datastore related path */ if (esxUtil_ParseDatastoreRelatedPath(src, &datastoreName, &directoryName, &fileName) < 0) { - goto failure; + goto cleanup; } if (directoryName == NULL) { if (virAsprintf(&absolutePath, "/vmfs/volumes/%s/%s", datastoreName, fileName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } else { if (virAsprintf(&absolutePath, "/vmfs/volumes/%s/%s/%s", datastoreName, directoryName, fileName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } } else if (STRPREFIX(src, "/")) { @@ -2177,29 +2186,30 @@ esxVMX_FormatFileName(esxVI_Context *ctx ATTRIBUTE_UNUSED, const char *src) if (absolutePath == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } else { /* Found relative path, this is not supported */ ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Found relative path '%s' in domain XML, this is not " "supported"), src); - goto failure; + goto cleanup; } /* FIXME: Check if referenced path/file really exists */ + success = true; + cleanup: + if (! success) { + VIR_FREE(absolutePath); + } + VIR_FREE(datastoreName); VIR_FREE(directoryName); VIR_FREE(fileName); return absolutePath; - - failure: - VIR_FREE(absolutePath); - - goto cleanup; } -- 1.7.0.4

On 05/26/2010 10:31 AM, Matthias Bolte wrote:
Eliminate almost all backward jumps by replacing this common pattern:
---
I've split this 200kb patch into two 100kb parts.
More of the same mechanical changes.
+ result = 0; + cleanup: VIR_FREE(prefix); VIR_FREE(deviceType); @@ -1666,13 +1672,12 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus,
return result;
- failure: - result = -1; - ignore: virDomainDiskDefFree(*def); *def = NULL;
+ result = 0; + goto cleanup;
This looks fishy - failure used to fall through to ignore, but now you lose the virDomainDiskDefFree.
+ result = 0; + cleanup: VIR_FREE(connectionType); VIR_FREE(addressType); @@ -1891,13 +1898,12 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def)
return result;
- failure: - result = -1; - ignore: virDomainNetDefFree(*def); *def = NULL;
+ result = 0; + goto cleanup;
And again.
+ result = 0; + cleanup: VIR_FREE(fileType); VIR_FREE(fileName);
return result;
- failure: - result = -1; - ignore: virDomainChrDefFree(*def); *def = NULL;
+ result = 0; + goto cleanup;
And again.
+ result = 0; + cleanup: VIR_FREE(fileType); VIR_FREE(fileName);
return result;
- failure: - result = -1; - ignore: virDomainChrDefFree(*def); *def = NULL;
+ result = 0; + goto cleanup;
And again. ACK, once you either figure out whether that idiom was safe, or fix those four cases. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

2010/5/27 Eric Blake <eblake@redhat.com>:
On 05/26/2010 10:31 AM, Matthias Bolte wrote:
Eliminate almost all backward jumps by replacing this common pattern:
---
I've split this 200kb patch into two 100kb parts.
More of the same mechanical changes.
+ result = 0; + cleanup: VIR_FREE(prefix); VIR_FREE(deviceType); @@ -1666,13 +1672,12 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus,
return result;
- failure: - result = -1; - ignore: virDomainDiskDefFree(*def); *def = NULL;
+ result = 0; + goto cleanup;
This looks fishy - failure used to fall through to ignore, but now you lose the virDomainDiskDefFree.
Good catch! I added cleanup: + if (result < 0) { + virDomainDiskDefFree(*def); + *def = NULL; + } to preserve the original behavior. I added the same pattern to all 4 functions containing an ignore label.
ACK, once you either figure out whether that idiom was safe, or fix those four cases.
Thanks, pushed both parts as one patch. Matthias
participants (2)
-
Eric Blake
-
Matthias Bolte