* src/phyp/phyp_driver.c (phypCreateServerSCSIAdapter)
(phypAttachDevice, phypVolumeLookupByPath, phypVolumeGetPath):
Avoid leaking phypExec result.
(phypBuildStoragePool): Avoid NULL dereference.
(phypInterfaceDestroy): Avoid redundant free.
---
src/phyp/phyp_driver.c | 49 +++++++++++++++++++++++++++++------------------
1 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index ec2ac09..2f00461 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -1,4 +1,3 @@
-
/*
* Copyright (C) 2010-2011 Red Hat, Inc.
* Copyright IBM Corp. 2009
@@ -1853,6 +1852,7 @@ phypCreateServerSCSIAdapter(virConnectPtr conn)
}
cmd = virBufferContentAndReset(&buf);
+ VIR_FREE(ret);
ret = phypExec(session, cmd, &exit_status, conn);
if (exit_status < 0 || ret == NULL)
@@ -1861,6 +1861,7 @@ phypCreateServerSCSIAdapter(virConnectPtr conn)
/* Finally I add the new scsi adapter to VIOS using the same slot
* I used in the VIOS configuration.
* */
+ VIR_FREE(ret);
virBufferAddLit(&buf, "chhwres -r virtualio --rsubtype scsi");
if (system_type == HMC)
virBufferVSprintf(&buf, " -m %s", managed_system);
@@ -2047,6 +2048,7 @@ phypAttachDevice(virDomainPtr domain, const char *xml)
/* Let's get the slot number for the adapter we just created
* */
+ VIR_FREE(ret);
virBufferAddLit(&buf, "lshwres -r virtualio --rsubtype scsi");
if (system_type == HMC)
virBufferVSprintf(&buf, " -m %s", managed_system);
@@ -2071,6 +2073,7 @@ phypAttachDevice(virDomainPtr domain, const char *xml)
/* Listing all the virtual_scsi_adapter interfaces, the new adapter must
* be appended to this list
* */
+ VIR_FREE(ret);
virBufferAddLit(&buf, "lssyscfg");
if (system_type == HMC)
virBufferVSprintf(&buf, " -m %s", managed_system);
@@ -2108,6 +2111,7 @@ phypAttachDevice(virDomainPtr domain, const char *xml)
}
cmd = virBufferContentAndReset(&buf);
+ VIR_FREE(ret);
ret = phypExec(session, cmd, &exit_status, conn);
if (virStrToLong_i(ret, &char_ptr, 10, &slot) == -1)
@@ -2116,6 +2120,7 @@ phypAttachDevice(virDomainPtr domain, const char *xml)
/* Finally I add the new scsi adapter to VIOS using the same slot
* I used in the VIOS configuration.
* */
+ VIR_FREE(ret);
virBufferAddLit(&buf, "chhwres -r virtualio --rsubtype scsi");
if (system_type == HMC)
virBufferVSprintf(&buf, " -m %s", managed_system);
@@ -2542,9 +2547,11 @@ phypVolumeLookupByPath(virConnectPtr conn, const char *volname)
int vios_id = phyp_driver->vios_id;
int exit_status = 0;
char *cmd = NULL;
- char *spname = NULL;
+ char *ret = NULL;
char *key = NULL;
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ char *char_ptr;
+ virStorageVolPtr result = NULL;
if (system_type == HMC)
virBufferVSprintf(&buf, "viosvrcmd -m %s --id %d -c '",
@@ -2564,25 +2571,30 @@ phypVolumeLookupByPath(virConnectPtr conn, const char *volname)
}
cmd = virBufferContentAndReset(&buf);
- spname = phypExec(session, cmd, &exit_status, conn);
+ ret = phypExec(session, cmd, &exit_status, conn);
- if (exit_status < 0 || spname == NULL)
- return NULL;
+ if (exit_status < 0 || ret == NULL)
+ goto cleanup;
- char *char_ptr = strchr(spname, '\n');
+ char_ptr = strchr(ret, '\n');
if (char_ptr)
*char_ptr = '\0';
if (VIR_ALLOC_N(key, MAX_KEY_SIZE) < 0) {
virReportOOMError();
- return NULL;
+ goto cleanup;
}
if (phypVolumeGetKey(conn, key, volname) == -1)
- return NULL;
+ goto cleanup;
+
+ result = virGetStorageVol(conn, ret, volname, key);
- return virGetStorageVol(conn, spname, volname, key);
+cleanup:
+ VIR_FREE(ret);
+ VIR_FREE(key);
+ return result;
}
static int
@@ -2738,7 +2750,7 @@ phypVolumeGetPath(virStorageVolPtr vol)
int vios_id = phyp_driver->vios_id;
int exit_status = 0;
char *cmd = NULL;
- char *sp = NULL;
+ char *ret = NULL;
char *path = NULL;
virBuffer buf = VIR_BUFFER_INITIALIZER;
char *char_ptr;
@@ -2763,20 +2775,20 @@ phypVolumeGetPath(virStorageVolPtr vol)
}
cmd = virBufferContentAndReset(&buf);
- sp = phypExec(session, cmd, &exit_status, conn);
+ ret = phypExec(session, cmd, &exit_status, conn);
- if (exit_status < 0 || sp == NULL)
+ if (exit_status < 0 || ret == NULL)
goto err;
- char_ptr = strchr(sp, '\n');
+ char_ptr = strchr(ret, '\n');
if (char_ptr)
*char_ptr = '\0';
- pv = phypVolumeGetPhysicalVolumeByStoragePool(vol, sp);
+ pv = phypVolumeGetPhysicalVolumeByStoragePool(vol, ret);
if (pv) {
- if (virAsprintf(&path, "/%s/%s/%s", pv, sp, vol->name) < 0)
{
+ if (virAsprintf(&path, "/%s/%s/%s", pv, ret, vol->name) < 0)
{
virReportOOMError();
goto err;
}
@@ -2785,11 +2797,12 @@ phypVolumeGetPath(virStorageVolPtr vol)
}
VIR_FREE(cmd);
+ VIR_FREE(ret);
return path;
err:
VIR_FREE(cmd);
- VIR_FREE(sp);
+ VIR_FREE(ret);
VIR_FREE(path);
return NULL;
@@ -3013,7 +3026,7 @@ phypBuildStoragePool(virConnectPtr conn, virStoragePoolDefPtr def)
ret = phypExec(session, cmd, &exit_status, conn);
if (exit_status < 0) {
- VIR_ERROR(_("Unable to create Storage Pool: %s"), ret);
+ VIR_ERROR(_("Unable to create Storage Pool: %s"), NULLSTR(ret));
goto err;
}
@@ -3357,8 +3370,6 @@ phypInterfaceDestroy(virInterfacePtr iface,
}
cmd = virBufferContentAndReset(&buf);
- VIR_FREE(ret);
-
ret = phypExec(session, cmd, &exit_status, iface->conn);
if (exit_status < 0 || ret == NULL)
--
1.7.4.2