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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list