
On 05/03/2013 04:53 PM, Michal Privoznik wrote:
--- src/vbox/vbox_XPCOMCGlue.c | 6 +- src/vbox/vbox_tmpl.c | 278 +++++++++++++++++++-------------------------- 2 files changed, 117 insertions(+), 167 deletions(-)
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 43ddac8..4ac7b91 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2290,7 +2288,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { def->virtType = VIR_DOMAIN_VIRT_VBOX; def->id = dom->id; memcpy(def->uuid, dom->uuid, VIR_UUID_BUFLEN); - def->name = strdup(dom->name); + if (VIR_STRDUP(def->name, dom->name) < 0) + goto cleanup;
Bailing out after one unsuccessful strdup? Other parts of this function don't share this defeatist attitude.
machine->vtbl->GetMemorySize(machine, &memorySize); def->mem.cur_balloon = memorySize * 1024;
@@ -2460,10 +2460,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
if (STREQ(valueTypeUtf8, "sdl")) { sdlPresent = 1; - if (valueDisplayUtf8) - sdlDisplay = strdup(valueDisplayUtf8); - if (sdlDisplay == NULL) { - virReportOOMError(); + if (valueDisplayUtf8 && + VIR_STRDUP(sdlDisplay, valueDisplayUtf8) < 0) { /* just don't go to cleanup yet as it is ok to have * sdlDisplay as NULL and we check it below if it * exist and then only use it there @@ -2474,10 +2472,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
if (STREQ(valueTypeUtf8, "gui")) { guiPresent = 1; - if (valueDisplayUtf8) - guiDisplay = strdup(valueDisplayUtf8); - if (guiDisplay == NULL) { - virReportOOMError(); + if (valueDisplayUtf8 && + VIR_STRDUP(guiDisplay, valueDisplayUtf8) < 0) { /* just don't go to cleanup yet as it is ok to have * guiDisplay as NULL and we check it below if it * exist and then only use it there @@ -2512,14 +2508,11 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { if (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0) { def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP; tmp = getenv("DISPLAY"); - if (tmp != NULL) { - def->graphics[def->ngraphics]->data.desktop.display = strdup(tmp); - if (def->graphics[def->ngraphics]->data.desktop.display == NULL) { - virReportOOMError(); - /* just don't go to cleanup yet as it is ok to have - * display as NULL - */ - } + if (tmp && + VIR_STRDUP(def->graphics[def->ngraphics]->data.desktop.display, tmp) < 0) { + /* just don't go to cleanup yet as it is ok to have + * display as NULL + */ } totalPresent++; def->ngraphics++;
You have preserved the existing behavior in these three hunks...
@@ -2649,9 +2642,9 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
if (hddType == HardDiskType_Immutable) def->disks[hddNum]->readonly = true; - def->disks[hddNum]->src = strdup(hddlocation); - def->disks[hddNum]->dst = strdup("hda"); - hddNum++; + if (VIR_STRDUP(def->disks[hddNum]->src, hddlocation) == 0 && + VIR_STRDUP(def->disks[hddNum]->dst, "hda") == 0) + hddNum++;
VBOX_UTF8_FREE(hddlocation); VBOX_UTF16_FREE(hddlocationUtf16); @@ -2670,9 +2663,9 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
if (hddType == HardDiskType_Immutable) def->disks[hddNum]->readonly = true; - def->disks[hddNum]->src = strdup(hddlocation); - def->disks[hddNum]->dst = strdup("hdb"); - hddNum++; + if (VIR_STRDUP(def->disks[hddNum]->src, hddlocation) == 0 && + VIR_STRDUP(def->disks[hddNum]->dst, "hdb") == 0) + hddNum++;
VBOX_UTF8_FREE(hddlocation); VBOX_UTF16_FREE(hddlocationUtf16); @@ -2691,9 +2684,9 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) {
if (hddType == HardDiskType_Immutable) def->disks[hddNum]->readonly = true; - def->disks[hddNum]->src = strdup(hddlocation); - def->disks[hddNum]->dst = strdup("hdd"); - hddNum++; + if (VIR_STRDUP_QUIET(def->disks[hddNum]->src, hddlocation) == 0 && + VIR_STRDUP_QUIET(def->disks[hddNum]->dst, "hdd") == 0) + hddNum++;
VBOX_UTF8_FREE(hddlocation); VBOX_UTF16_FREE(hddlocationUtf16);
.. but not in these three. I think you should call ignore_value(VIR_STRDUP()) in all three. Or fix it properly.
@@ -2780,7 +2773,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { medium->vtbl->GetLocation(medium, &mediumLocUtf16); VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8); VBOX_UTF16_FREE(mediumLocUtf16); - def->disks[diskCount]->src = strdup(mediumLocUtf8); + ignore_value(VIR_STRDUP(def->disks[diskCount]->src, mediumLocUtf8));
VIR_STRDUP_QUIET, or remove the virReportOOMError a few lines below.
VBOX_UTF8_FREE(mediumLocUtf8);
if (!(def->disks[diskCount]->src)) {
@@ -3120,8 +3111,9 @@ sharedFoldersCleanup: def->disks[def->ndisks - 1]->bus = VIR_DOMAIN_DISK_BUS_IDE; def->disks[def->ndisks - 1]->type = VIR_DOMAIN_DISK_TYPE_FILE; def->disks[def->ndisks - 1]->readonly = true; - def->disks[def->ndisks - 1]->src = strdup(location); - def->disks[def->ndisks - 1]->dst = strdup("hdc"); + if (VIR_STRDUP(def->disks[def->ndisks - 1]->src, location) < 0 || + VIR_STRDUP(def->disks[def->ndisks - 1]->dst, "hdc") < 0) + def->ndisks--; } else { def->ndisks--; virReportOOMError(); @@ -3167,8 +3159,9 @@ sharedFoldersCleanup: def->disks[def->ndisks - 1]->bus = VIR_DOMAIN_DISK_BUS_FDC; def->disks[def->ndisks - 1]->type = VIR_DOMAIN_DISK_TYPE_FILE; def->disks[def->ndisks - 1]->readonly = false; - def->disks[def->ndisks - 1]->src = strdup(location); - def->disks[def->ndisks - 1]->dst = strdup("fda"); + if (VIR_STRDUP(def->disks[def->ndisks - 1]->src, location) < 0 || + VIR_STRDUP(def->disks[def->ndisks - 1]->dst, "fda") < 0) + def->ndisks--; } else { def->ndisks--; virReportOOMError();
ignore_value(VIR_STRDUP) in both hunks.
@@ -6247,12 +6225,12 @@ vboxDomainSnapshotListNames(virDomainPtr dom, } VBOX_UTF16_TO_UTF8(nameUtf16, &name); VBOX_UTF16_FREE(nameUtf16); - names[i] = strdup(name); - VBOX_UTF8_FREE(name); - if (!names[i]) { + if (VIR_STRDUP(names[i], name) < 0) { virReportOOMError();
redundant virReportOOMError()
+ VBOX_UTF8_FREE(name); goto cleanup; } + VBOX_UTF8_FREE(name); }
if (count <= nameslen)
@@ -8117,8 +8087,7 @@ static char *vboxNetworkGetXMLDesc(virNetworkPtr network, networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType);
if (interfaceType == HostNetworkInterfaceType_HostOnly) { - def->name = strdup(network->name); - if (def->name != NULL) { + if (VIR_STRDUP(def->name, network->name) == 0) { PRUnichar *networkNameUtf16 = NULL; IDHCPServer *dhcpServer = NULL; vboxIID vboxnet0IID = VBOX_IID_INITIALIZER;
You can delete the else branch with virReportOOMError() The error handling is horrible in a few places, but that's pre-existing. ACK Jan