* src/phyp/phyp_driver.c (phypUUIDTable_Init): Avoid memory leak on error. --- src/phyp/phyp_driver.c | 46 +++++++++++++++++++++++++++------------------- 1 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index 7aa494d..0c69d4f 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -807,31 +807,35 @@ phypUUIDTable_Pull(virConnectPtr conn) static int phypUUIDTable_Init(virConnectPtr conn) { - uuid_tablePtr uuid_table; + uuid_tablePtr uuid_table = NULL; phyp_driverPtr phyp_driver; int nids_numdomains = 0; int nids_listdomains = 0; int *ids = NULL; unsigned int i = 0; + int ret = -1; + bool table_created = false; if ((nids_numdomains = phypNumDomainsGeneric(conn, 2)) < 0) - goto err; + goto cleanup; if (VIR_ALLOC_N(ids, nids_numdomains) < 0) { virReportOOMError(); - goto err; + goto cleanup; } if ((nids_listdomains = phypListDomainsGeneric(conn, ids, nids_numdomains, 1)) < 0) - goto err; + goto cleanup; /* exit early if there are no domains */ - if (nids_numdomains == 0 && nids_listdomains == 0) - goto exit; - else if (nids_numdomains != nids_listdomains) { + if (nids_numdomains == 0 && nids_listdomains == 0) { + ret = 0; + goto cleanup; + } + if (nids_numdomains != nids_listdomains) { VIR_ERROR0(_("Unable to determine number of domains.")); - goto err; + goto cleanup; } phyp_driver = conn->privateData; @@ -841,11 +845,12 @@ phypUUIDTable_Init(virConnectPtr conn) /* try to get the table from server */ if (phypUUIDTable_Pull(conn) == -1) { /* file not found in the server, creating a new one */ + table_created = true; if (VIR_ALLOC_N(uuid_table->lpars, uuid_table->nlpars) >= 0) { for (i = 0; i < uuid_table->nlpars; i++) { if (VIR_ALLOC(uuid_table->lpars[i]) < 0) { virReportOOMError(); - goto err; + goto cleanup; } uuid_table->lpars[i]->id = ids[i]; @@ -855,27 +860,30 @@ phypUUIDTable_Init(virConnectPtr conn) } } else { virReportOOMError(); - goto err; + goto cleanup; } if (phypUUIDTable_WriteFile(conn) == -1) - goto err; + goto cleanup; if (phypUUIDTable_Push(conn) == -1) - goto err; + goto cleanup; } else { if (phypUUIDTable_ReadFile(conn) == -1) - goto err; - goto exit; + goto cleanup; } - exit: - VIR_FREE(ids); - return 0; + ret = 0; - err: +cleanup: + if (ret < 0 && table_created) { + for (i = 0; i < uuid_table->nlpars; i++) { + VIR_FREE(uuid_table->lpars[i]); + } + VIR_FREE(uuid_table->lpars); + } VIR_FREE(ids); - return -1; + return ret; } static void -- 1.7.4.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list