Also fix memory leaks along the way in phypCreateServerSCSIAdapter and phypAttachDevice. --- src/phyp/phyp_driver.c | 592 +++++++++++++++++++++++------------------------- 1 files changed, 289 insertions(+), 303 deletions(-) diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index bd508fb..f441261 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -109,7 +109,7 @@ waitsocket(int socket_fd, LIBSSH2_SESSION * session) /* this function is the layer that manipulates the ssh channel itself * and executes the commands on the remote machine */ static char * -phypExec(LIBSSH2_SESSION * session, char *cmd, int *exit_status, +phypExec(LIBSSH2_SESSION *session, const char *cmd, int *exit_status, virConnectPtr conn) { LIBSSH2_CHANNEL *channel; @@ -249,19 +249,16 @@ phypGetVIOSPartitionID(virConnectPtr conn) ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &id) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return id; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return id; } static virCapsPtr @@ -324,7 +321,7 @@ phypNumDomainsGeneric(virConnectPtr conn, unsigned int type) LIBSSH2_SESSION *session = connection_data->session; int system_type = phyp_driver->system_type; int exit_status = 0; - int ndom = 0; + int ndom = -1; char *char_ptr; char *cmd = NULL; char *ret = NULL; @@ -358,19 +355,16 @@ phypNumDomainsGeneric(virConnectPtr conn, unsigned int type) ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &ndom) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return ndom; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return ndom; } /* This is a generic function that won't be used directly by @@ -417,7 +411,7 @@ phypListDomainsGeneric(virConnectPtr conn, int *ids, int nids, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; /* I need to parse the textual return in order to get the ids */ line = ret; @@ -426,7 +420,7 @@ phypListDomainsGeneric(virConnectPtr conn, int *ids, int nids, if (virStrToLong_i(line, &next_line, 10, &ids[got]) == -1) { VIR_ERROR(_("Cannot parse number from '%s'"), line); got = -1; - goto err; + goto cleanup; } got++; line = next_line; @@ -434,9 +428,10 @@ phypListDomainsGeneric(virConnectPtr conn, int *ids, int nids, line++; /* skip \n */ } - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); + return got; } @@ -1300,7 +1295,7 @@ phypGetLparID(LIBSSH2_SESSION * session, const char *managed_system, phyp_driverPtr phyp_driver = conn->privateData; int system_type = phyp_driver->system_type; int exit_status = 0; - int lpar_id = 0; + int lpar_id = -1; char *char_ptr; char *cmd = NULL; char *ret = NULL; @@ -1320,19 +1315,16 @@ phypGetLparID(LIBSSH2_SESSION * session, const char *managed_system, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &lpar_id) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return lpar_id; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return lpar_id; } /* return the lpar name given a lpar_id and a managed system name */ @@ -1361,21 +1353,20 @@ phypGetLparNAME(LIBSSH2_SESSION * session, const char *managed_system, ret = phypExec(session, cmd, &exit_status, conn); - if (exit_status < 0 || ret == NULL) - goto err; + if (exit_status < 0 || ret == NULL) { + VIR_FREE(ret); + goto cleanup; + } char_ptr = strchr(ret, '\n'); if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); - return ret; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return ret; } @@ -1442,7 +1433,7 @@ phypGetLparMem(virConnectPtr conn, const char *managed_system, int lpar_id, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; char_ptr = strchr(ret, '\n'); @@ -1450,17 +1441,13 @@ phypGetLparMem(virConnectPtr conn, const char *managed_system, int lpar_id, *char_ptr = '\0'; if (virStrToLong_i(ret, &char_ptr, 10, &memory) == -1) - goto err; - - VIR_FREE(cmd); - VIR_FREE(ret); - return memory; + goto cleanup; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return 0; + return memory; } static unsigned long @@ -1494,7 +1481,7 @@ phypGetLparCPUGeneric(virConnectPtr conn, const char *managed_system, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; char_ptr = strchr(ret, '\n'); @@ -1502,16 +1489,13 @@ phypGetLparCPUGeneric(virConnectPtr conn, const char *managed_system, *char_ptr = '\0'; if (virStrToLong_i(ret, &char_ptr, 10, &vcpus) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return (unsigned long) vcpus; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + return vcpus; } static unsigned long @@ -1552,7 +1536,7 @@ phypGetRemoteSlot(virConnectPtr conn, const char *managed_system, char *cmd = NULL; char *ret = NULL; char *char_ptr; - int remote_slot = 0; + int remote_slot = -1; int exit_status = 0; virBuffer buf = VIR_BUFFER_INITIALIZER; @@ -1571,7 +1555,7 @@ phypGetRemoteSlot(virConnectPtr conn, const char *managed_system, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; char_ptr = strchr(ret, '\n'); @@ -1579,16 +1563,13 @@ phypGetRemoteSlot(virConnectPtr conn, const char *managed_system, *char_ptr = '\0'; if (virStrToLong_i(ret, &char_ptr, 10, &remote_slot) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return remote_slot; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return remote_slot; } /* XXX - is this needed? */ @@ -1629,7 +1610,7 @@ phypGetBackingDevice(virConnectPtr conn, const char *managed_system, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; /* here is a little trick to deal returns of this kind: * @@ -1645,13 +1626,13 @@ phypGetBackingDevice(virConnectPtr conn, const char *managed_system, if (char_ptr[0] == '/') char_ptr++; else - goto err; + goto cleanup; backing_device = strdup(char_ptr); if (backing_device == NULL) { virReportOOMError(); - goto err; + goto cleanup; } } else { backing_device = ret; @@ -1663,14 +1644,11 @@ phypGetBackingDevice(virConnectPtr conn, const char *managed_system, if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return backing_device; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return backing_device; } static char * @@ -1702,21 +1680,20 @@ phypGetLparProfile(virConnectPtr conn, int lpar_id) ret = phypExec(session, cmd, &exit_status, conn); - if (exit_status < 0 || ret == NULL) - goto err; + if (exit_status < 0 || ret == NULL) { + VIR_FREE(ret); + goto cleanup; + } char_ptr = strchr(ret, '\n'); if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); - return ret; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return ret; } static int @@ -1733,12 +1710,12 @@ phypGetVIOSNextSlotNumber(virConnectPtr conn) char *cmd = NULL; char *ret = NULL; char *profile = NULL; - int slot = 0; + int slot = -1; virBuffer buf = VIR_BUFFER_INITIALIZER; if (!(profile = phypGetLparProfile(conn, vios_id))) { VIR_ERROR0(_("Unable to get VIOS profile name.")); - goto err; + return -1; } virBufferAddLit(&buf, "lssyscfg"); @@ -1756,7 +1733,7 @@ phypGetVIOSNextSlotNumber(virConnectPtr conn) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } cmd = virBufferContentAndReset(&buf); @@ -1764,24 +1741,25 @@ phypGetVIOSNextSlotNumber(virConnectPtr conn) ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &slot) == -1) - goto err; + goto cleanup; - VIR_FREE(cmd); - VIR_FREE(ret); - return slot + 1; + slot += 1; - err: + cleanup: + VIR_FREE(profile); VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return slot; } static int phypCreateServerSCSIAdapter(virConnectPtr conn) { + int result = -1; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -1800,17 +1778,17 @@ phypCreateServerSCSIAdapter(virConnectPtr conn) (vios_name = phypGetLparNAME(session, managed_system, vios_id, conn))) { VIR_ERROR0(_("Unable to get VIOS name")); - goto err; + goto cleanup; } if (!(profile = phypGetLparProfile(conn, vios_id))) { VIR_ERROR0(_("Unable to get VIOS profile name.")); - goto err; + goto cleanup; } if ((slot = phypGetVIOSNextSlotNumber(conn)) == -1) { VIR_ERROR0(_("Unable to get free slot number")); - goto err; + goto cleanup; } /* Listing all the virtual_scsi_adapter interfaces, the new adapter must @@ -1825,14 +1803,14 @@ phypCreateServerSCSIAdapter(virConnectPtr conn) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; /* Here I change the VIOS configuration to append the new adapter * with the free slot I got with phypGetVIOSNextSlotNumber. @@ -1846,14 +1824,17 @@ phypCreateServerSCSIAdapter(virConnectPtr conn) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; /* Finally I add the new scsi adapter to VIOS using the same slot * I used in the VIOS configuration. @@ -1867,27 +1848,27 @@ phypCreateServerSCSIAdapter(virConnectPtr conn) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; - VIR_FREE(profile); - VIR_FREE(vios_name); - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(profile); VIR_FREE(vios_name); VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return result; } static char * @@ -1925,28 +1906,27 @@ phypGetVIOSFreeSCSIAdapter(virConnectPtr conn) ret = phypExec(session, cmd, &exit_status, conn); - if (exit_status < 0 || ret == NULL) - goto err; + if (exit_status < 0 || ret == NULL) { + VIR_FREE(ret); + goto cleanup; + } char_ptr = strchr(ret, '\n'); if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); - return ret; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return ret; } static int phypAttachDevice(virDomainPtr domain, const char *xml) { - + int result = -1; virConnectPtr conn = domain->conn; ConnectionData *connection_data = domain->conn->networkPrivateData; phyp_driverPtr phyp_driver = domain->conn->privateData; @@ -1982,21 +1962,21 @@ phypAttachDevice(virDomainPtr domain, const char *xml) if (def->os.type == NULL) { virReportOOMError(); - goto err; + goto cleanup; } dev = virDomainDeviceDefParse(phyp_driver->caps, def, xml, VIR_DOMAIN_XML_INACTIVE); if (!dev) { virReportOOMError(); - goto err; + goto cleanup; } if (! (vios_name = phypGetLparNAME(session, managed_system, vios_id, conn))) { VIR_ERROR0(_("Unable to get VIOS name")); - goto err; + goto cleanup; } /* First, let's look for a free SCSI Adapter @@ -2006,11 +1986,11 @@ phypAttachDevice(virDomainPtr domain, const char *xml) * */ if (phypCreateServerSCSIAdapter(conn) == -1) { VIR_ERROR0(_("Unable to create new virtual adapter")); - goto err; + goto cleanup; } else { if (!(scsi_adapter = phypGetVIOSFreeSCSIAdapter(conn))) { VIR_ERROR0(_("Unable to create new virtual adapter")); - goto err; + goto cleanup; } } } @@ -2028,18 +2008,21 @@ phypAttachDevice(virDomainPtr domain, const char *xml) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (!(profile = phypGetLparProfile(conn, domain->id))) { VIR_ERROR0(_("Unable to get VIOS profile name.")); - goto err; + goto cleanup; } /* Let's get the slot number for the adapter we just created @@ -2053,17 +2036,20 @@ phypAttachDevice(virDomainPtr domain, const char *xml) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &slot) == -1) - goto err; + goto cleanup; /* Listing all the virtual_scsi_adapter interfaces, the new adapter must * be appended to this list @@ -2078,14 +2064,17 @@ phypAttachDevice(virDomainPtr domain, const char *xml) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; /* Here I change the LPAR configuration to append the new adapter * with the new slot we just created @@ -2101,14 +2090,17 @@ phypAttachDevice(virDomainPtr domain, const char *xml) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (virStrToLong_i(ret, &char_ptr, 10, &slot) == -1) - goto err; + goto cleanup; /* Finally I add the new scsi adapter to VIOS using the same slot * I used in the VIOS configuration. @@ -2122,35 +2114,35 @@ phypAttachDevice(virDomainPtr domain, const char *xml) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } - cmd = virBufferContentAndReset(&buf); + VIR_FREE(cmd); + VIR_FREE(ret); + + cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) { VIR_ERROR0(_ ("Possibly you don't have IBM Tools installed in your LPAR." "Contact your support to enable this feature.")); - goto err; + goto cleanup; } - VIR_FREE(cmd); - VIR_FREE(ret); - VIR_FREE(def); - VIR_FREE(dev); - VIR_FREE(vios_name); - VIR_FREE(scsi_adapter); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - VIR_FREE(def); - VIR_FREE(dev); + virDomainDeviceDefFree(dev); + virDomainDefFree(def); VIR_FREE(vios_name); VIR_FREE(scsi_adapter); - return -1; + VIR_FREE(profile); + VIR_FREE(domain_name); + + return result; } static char * @@ -2188,21 +2180,20 @@ phypVolumeGetKey(virConnectPtr conn, const char *name) cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, conn); - if (exit_status < 0 || ret == NULL) - goto err; + if (exit_status < 0 || ret == NULL) { + VIR_FREE(ret); + goto cleanup; + } char_ptr = strchr(ret, '\n'); if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); - return ret; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return ret; } static char * @@ -2240,21 +2231,20 @@ phypGetStoragePoolDevice(virConnectPtr conn, char *name) ret = phypExec(session, cmd, &exit_status, conn); - if (exit_status < 0 || ret == NULL) - goto err; + if (exit_status < 0 || ret == NULL) { + VIR_FREE(ret); + goto cleanup; + } char_ptr = strchr(ret, '\n'); if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); - return ret; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return ret; } static unsigned long int @@ -2269,7 +2259,7 @@ phypGetStoragePoolSize(virConnectPtr conn, char *name) int vios_id = phyp_driver->vios_id; char *cmd = NULL; char *ret = NULL; - int sp_size = 0; + int sp_size = -1; char *char_ptr; virBuffer buf = VIR_BUFFER_INITIALIZER; @@ -2294,19 +2284,16 @@ phypGetStoragePoolSize(virConnectPtr conn, char *name) ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &sp_size) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return sp_size; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return sp_size; } static char * @@ -2323,7 +2310,7 @@ phypBuildVolume(virConnectPtr conn, const char *lvname, const char *spname, char *ret = NULL; int exit_status = 0; virBuffer buf = VIR_BUFFER_INITIALIZER; - char *key; + char *key = NULL; if (system_type == HMC) virBufferVSprintf(&buf, "viosvrcmd -m %s --id %d -c '", @@ -2345,22 +2332,19 @@ phypBuildVolume(virConnectPtr conn, const char *lvname, const char *spname, if (exit_status < 0) { VIR_ERROR(_("Unable to create Volume: %s"), ret); - goto err; + goto cleanup; } key = phypVolumeGetKey(conn, lvname); if (key == NULL) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return key; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return key; } static virStorageVolPtr @@ -2514,22 +2498,20 @@ phypVolumeGetPhysicalVolumeByStoragePool(virStorageVolPtr vol, char *sp) ret = phypExec(session, cmd, &exit_status, conn); - if (exit_status < 0 || ret == NULL) - goto err; + if (exit_status < 0 || ret == NULL) { + VIR_FREE(ret); + goto cleanup; + } char_ptr = strchr(ret, '\n'); if (char_ptr) *char_ptr = '\0'; + cleanup: VIR_FREE(cmd); - return ret; - - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return NULL; + return ret; } static virStorageVolPtr @@ -2547,7 +2529,7 @@ phypVolumeLookupByPath(virConnectPtr conn, const char *volname) char *char_ptr; char *key = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; - virStorageVolPtr vol; + virStorageVolPtr vol = NULL; if (system_type == HMC) virBufferVSprintf(&buf, "viosvrcmd -m %s --id %d -c '", @@ -2570,7 +2552,7 @@ phypVolumeLookupByPath(virConnectPtr conn, const char *volname) spname = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || spname == NULL) - return NULL; + goto cleanup; char_ptr = strchr(spname, '\n'); @@ -2580,10 +2562,13 @@ phypVolumeLookupByPath(virConnectPtr conn, const char *volname) key = phypVolumeGetKey(conn, volname); if (key == NULL) - return NULL; + goto cleanup; vol = virGetStorageVol(conn, spname, volname, key); + cleanup: + VIR_FREE(cmd); + VIR_FREE(spname); VIR_FREE(key); return vol; @@ -2593,6 +2578,7 @@ static int phypGetStoragePoolUUID(virConnectPtr conn, unsigned char *uuid, const char *name) { + int result = -1; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -2625,19 +2611,18 @@ phypGetStoragePoolUUID(virConnectPtr conn, unsigned char *uuid, ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (memmove(uuid, ret, VIR_UUID_BUFLEN) == NULL) - goto err; + goto cleanup; - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return result; } static virStoragePoolPtr @@ -2654,22 +2639,21 @@ phypStoragePoolLookupByName(virConnectPtr conn, const char *name) static char * phypVolumeGetXMLDesc(virStorageVolPtr vol, unsigned int flags) { + virStorageVolDef voldef; + virStoragePoolDef pool; + virStoragePoolPtr sp; char *xml; virCheckFlags(0, NULL); - virStorageVolDef voldef; memset(&voldef, 0, sizeof(virStorageVolDef)); + memset(&pool, 0, sizeof(virStoragePoolDef)); - virStoragePoolPtr sp = - phypStoragePoolLookupByName(vol->conn, vol->pool); + sp = phypStoragePoolLookupByName(vol->conn, vol->pool); if (!sp) goto err; - virStoragePoolDef pool; - memset(&pool, 0, sizeof(virStoragePoolDef)); - if (sp->name != NULL) { pool.name = sp->name; } else { @@ -2773,7 +2757,7 @@ phypVolumeGetPath(virStorageVolPtr vol) sp = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || sp == NULL) - goto err; + goto cleanup; char_ptr = strchr(sp, '\n'); @@ -2782,23 +2766,20 @@ phypVolumeGetPath(virStorageVolPtr vol) pv = phypVolumeGetPhysicalVolumeByStoragePool(vol, sp); - if (pv) { - if (virAsprintf(&path, "/%s/%s/%s", pv, sp, vol->name) < 0) { - virReportOOMError(); - goto err; - } - } else { - goto err; - } + if (!pv) + goto cleanup; - VIR_FREE(cmd); - return path; + if (virAsprintf(&path, "/%s/%s/%s", pv, sp, vol->name) < 0) { + virReportOOMError(); + goto cleanup; + } - err: + cleanup: VIR_FREE(cmd); VIR_FREE(sp); VIR_FREE(path); - return NULL; + + return path; } @@ -2806,6 +2787,7 @@ static int phypStoragePoolListVolumes(virStoragePoolPtr pool, char **const volumes, int nvolumes) { + bool success = false; virConnectPtr conn = pool->conn; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; @@ -2844,7 +2826,7 @@ phypStoragePoolListVolumes(virStoragePoolPtr pool, char **const volumes, /* I need to parse the textual return in order to get the volumes */ if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; else { volumes_list = ret; @@ -2855,7 +2837,7 @@ phypStoragePoolListVolumes(virStoragePoolPtr pool, char **const volumes, *char_ptr2 = '\0'; if ((volumes[got++] = strdup(volumes_list)) == NULL) { virReportOOMError(); - goto err; + goto cleanup; } char_ptr2++; volumes_list = char_ptr2; @@ -2864,16 +2846,20 @@ phypStoragePoolListVolumes(virStoragePoolPtr pool, char **const volumes, } } - VIR_FREE(cmd); - VIR_FREE(ret); - return got; + success = true; + + cleanup: + if (!success) { + for (i = 0; i < got; i++) + VIR_FREE(volumes[i]); + + got = -1; + } - err: - for (i = 0; i < got; i++) - VIR_FREE(volumes[i]); VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return got; } static int @@ -2885,7 +2871,7 @@ phypStoragePoolNumOfVolumes(virStoragePoolPtr pool) LIBSSH2_SESSION *session = connection_data->session; int system_type = phyp_driver->system_type; int exit_status = 0; - int nvolumes = 0; + int nvolumes = -1; char *cmd = NULL; char *ret = NULL; char *managed_system = phyp_driver->managed_system; @@ -2911,27 +2897,25 @@ phypStoragePoolNumOfVolumes(virStoragePoolPtr pool) ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &nvolumes) == -1) - goto err; + goto cleanup; /* We need to remove 2 line from the header text output */ nvolumes -= 2; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return nvolumes; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return nvolumes; } static int phypDestroyStoragePool(virStoragePoolPtr pool) { + int result = -1; virConnectPtr conn = pool->conn; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; @@ -2965,29 +2949,29 @@ phypDestroyStoragePool(virStoragePoolPtr pool) "'rmsp %s'", managed_system, vios_id, pool->name) < 0) { virReportOOMError(); - goto err; + goto cleanup; } ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0) { VIR_ERROR(_("Unable to create Storage Pool: %s"), ret); - goto err; + goto cleanup; } - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return result; } static int phypBuildStoragePool(virConnectPtr conn, virStoragePoolDefPtr def) { + int result = -1; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -3021,17 +3005,16 @@ phypBuildStoragePool(virConnectPtr conn, virStoragePoolDefPtr def) if (exit_status < 0) { VIR_ERROR(_("Unable to create Storage Pool: %s"), ret); - goto err; + goto cleanup; } - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return result; } @@ -3043,7 +3026,7 @@ phypNumOfStoragePools(virConnectPtr conn) LIBSSH2_SESSION *session = connection_data->session; int system_type = phyp_driver->system_type; int exit_status = 0; - int nsp = 0; + int nsp = -1; char *cmd = NULL; char *ret = NULL; char *managed_system = phyp_driver->managed_system; @@ -3072,24 +3055,22 @@ phypNumOfStoragePools(virConnectPtr conn) ret = phypExec(session, cmd, &exit_status, conn); if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; if (virStrToLong_i(ret, &char_ptr, 10, &nsp) == -1) - goto err; + goto cleanup; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return nsp; - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return nsp; } static int phypListStoragePools(virConnectPtr conn, char **const pools, int npools) { + bool success = false; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -3125,7 +3106,7 @@ phypListStoragePools(virConnectPtr conn, char **const pools, int npools) /* I need to parse the textual return in order to get the storage pools */ if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; else { storage_pools = ret; @@ -3136,7 +3117,7 @@ phypListStoragePools(virConnectPtr conn, char **const pools, int npools) *char_ptr2 = '\0'; if ((pools[got++] = strdup(storage_pools)) == NULL) { virReportOOMError(); - goto err; + goto cleanup; } char_ptr2++; storage_pools = char_ptr2; @@ -3145,16 +3126,20 @@ phypListStoragePools(virConnectPtr conn, char **const pools, int npools) } } - VIR_FREE(cmd); - VIR_FREE(ret); - return got; + success = true; + + cleanup: + if (!success) { + for (i = 0; i < got; i++) + VIR_FREE(pools[i]); + + got = -1; + } - err: - for (i = 0; i < got; i++) - VIR_FREE(pools[i]); VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return got; } static virStoragePoolPtr @@ -3421,6 +3406,7 @@ phypListDomains(virConnectPtr conn, int *ids, int nids) static int phypListDefinedDomains(virConnectPtr conn, char **const names, int nnames) { + bool success = false; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -3451,7 +3437,7 @@ phypListDefinedDomains(virConnectPtr conn, char **const names, int nnames) /* I need to parse the textual return in order to get the domains */ if (exit_status < 0 || ret == NULL) - goto err; + goto cleanup; else { domains = ret; @@ -3462,7 +3448,7 @@ phypListDefinedDomains(virConnectPtr conn, char **const names, int nnames) *char_ptr2 = '\0'; if ((names[got++] = strdup(domains)) == NULL) { virReportOOMError(); - goto err; + goto cleanup; } char_ptr2++; domains = char_ptr2; @@ -3471,16 +3457,20 @@ phypListDefinedDomains(virConnectPtr conn, char **const names, int nnames) } } - VIR_FREE(cmd); - VIR_FREE(ret); - return got; + success = true; + + cleanup: + if (!success) { + for (i = 0; i < got; i++) + VIR_FREE(names[i]); + + got = -1; + } - err: - for (i = 0; i < got; i++) - VIR_FREE(names[i]); VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return got; } static virDomainPtr @@ -3524,22 +3514,20 @@ phypDomainLookupByID(virConnectPtr conn, int lpar_id) conn); if (phypGetLparUUID(lpar_uuid, lpar_id, conn) == -1) - goto err; + goto cleanup; if (exit_status < 0) - goto err; + goto cleanup; dom = virGetDomain(conn, lpar_name, lpar_uuid); if (dom) dom->id = lpar_id; + cleanup: VIR_FREE(lpar_name); - return dom; - err: - VIR_FREE(lpar_name); - return NULL; + return dom; } static char * @@ -3596,6 +3584,7 @@ phypDomainDumpXML(virDomainPtr dom, int flags) static int phypDomainResume(virDomainPtr dom) { + int result = -1; ConnectionData *connection_data = dom->conn->networkPrivateData; phyp_driverPtr phyp_driver = dom->conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -3621,21 +3610,21 @@ phypDomainResume(virDomainPtr dom) ret = phypExec(session, cmd, &exit_status, dom->conn); if (exit_status < 0) - goto err; + goto cleanup; - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return result; } static int phypDomainShutdown(virDomainPtr dom) { + int result = -1; ConnectionData *connection_data = dom->conn->networkPrivateData; virConnectPtr conn = dom->conn; LIBSSH2_SESSION *session = connection_data->session; @@ -3654,23 +3643,22 @@ phypDomainShutdown(virDomainPtr dom) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return 0; + return -1; } cmd = virBufferContentAndReset(&buf); ret = phypExec(session, cmd, &exit_status, dom->conn); if (exit_status < 0) - goto err; + goto cleanup; - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return 0; + + return result; } static int @@ -3699,6 +3687,7 @@ phypDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) static int phypDomainDestroy(virDomainPtr dom) { + int result = -1; ConnectionData *connection_data = dom->conn->networkPrivateData; phyp_driverPtr phyp_driver = dom->conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -3723,27 +3712,25 @@ phypDomainDestroy(virDomainPtr dom) ret = phypExec(session, cmd, &exit_status, dom->conn); if (exit_status < 0) - goto err; + goto cleanup; if (phypUUIDTable_RemLpar(dom->conn, dom->id) == -1) - goto err; + goto cleanup; dom->id = -1; + result = 0; + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return 0; - - err: - VIR_FREE(cmd); - VIR_FREE(ret); - return -1; + return result; } static int phypBuildLpar(virConnectPtr conn, virDomainDefPtr def) { + int result = -1; ConnectionData *connection_data = conn->networkPrivateData; phyp_driverPtr phyp_driver = conn->privateData; LIBSSH2_SESSION *session = connection_data->session; @@ -3758,27 +3745,27 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def) PHYP_ERROR(VIR_ERR_XML_ERROR,"%s", _("Field \"<memory>\" on the domain XML file is missing or has " "invalid value.")); - goto err; + goto cleanup; } if (!def->mem.max_balloon) { PHYP_ERROR(VIR_ERR_XML_ERROR,"%s", _("Field \"<currentMemory>\" on the domain XML file is missing or" " has invalid value.")); - goto err; + goto cleanup; } if (def->ndisks < 1) { PHYP_ERROR(VIR_ERR_XML_ERROR, "%s", _("Domain XML must contain at least one \"<disk>\" element.")); - goto err; + goto cleanup; } if (!def->disks[0]->src) { PHYP_ERROR(VIR_ERR_XML_ERROR,"%s", _("Field \"<src>\" under \"<disk>\" on the domain XML file is " "missing.")); - goto err; + goto cleanup; } virBufferAddLit(&buf, "mksyscfg"); @@ -3792,7 +3779,7 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def) if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); - return -1; + goto cleanup; } cmd = virBufferContentAndReset(&buf); @@ -3800,22 +3787,21 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def) if (exit_status < 0) { VIR_ERROR(_("Unable to create LPAR. Reason: '%s'"), ret); - goto err; + goto cleanup; } if (phypUUIDTable_AddLpar(conn, def->uuid, def->id) == -1) { VIR_ERROR0(_("Unable to add LPAR to the table")); - goto err; + goto cleanup; } - VIR_FREE(cmd); - VIR_FREE(ret); - return 0; + result = 0; - err: + cleanup: VIR_FREE(cmd); VIR_FREE(ret); - return -1; + + return result; } static virDomainPtr -- 1.7.0.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list