--- daemon/remote.c | 10 +-- src/conf/domain_conf.c | 4 +- src/conf/node_device_conf.c | 13 +++- src/esx/esx_driver.c | 5 ++ src/lxc/lxc_driver.c | 27 +++++-- src/openvz/openvz_conf.c | 12 ++- src/openvz/openvz_driver.c | 17 +++-- src/phyp/phyp_driver.c | 7 ++- src/qemu/qemu_conf.c | 64 +++++++++++++---- src/qemu/qemu_driver.c | 12 ++-- src/qemu/qemu_monitor_text.c | 4 +- src/remote/remote_driver.c | 135 +++++++++++++++++++++++++++++++---- src/secret/secret_driver.c | 8 ++- src/security/security_apparmor.c | 5 +- src/storage/storage_backend_scsi.c | 15 ++++ src/util/conf.c | 14 ++++ src/vbox/vbox_tmpl.c | 25 +++++-- src/xen/xen_driver.c | 12 +++- src/xen/xen_hypervisor.c | 15 ++++- src/xen/xen_inotify.c | 13 ++-- src/xen/xend_internal.c | 45 ++++++++++--- src/xen/xm_internal.c | 47 ++++++++++--- src/xen/xs_internal.c | 64 ++++++++++++----- 23 files changed, 444 insertions(+), 129 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 4296fc3..31d9841 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -565,7 +565,7 @@ remoteDispatchDomainSetSchedulerParameters (struct qemud_server *server ATTRIBUT remoteDispatchFormatError (rerr, "%s", _("nparams too large")); return -1; } - if (VIR_ALLOC_N(params, nparams)) { + if (VIR_ALLOC_N(params, nparams) < 0) { remoteDispatchOOMError(rerr); return -1; } @@ -721,10 +721,8 @@ remoteDispatchDomainBlockPeek (struct qemud_server *server ATTRIBUTE_UNUSED, ret->buffer.buffer_len = size; if (VIR_ALLOC_N (ret->buffer.buffer_val, size) < 0) { - char ebuf[1024]; virDomainFree (dom); - remoteDispatchFormatError (rerr, "%s", - virStrerror(errno, ebuf, sizeof ebuf)); + remoteDispatchOOMError(rerr); return -1; } @@ -772,10 +770,8 @@ remoteDispatchDomainMemoryPeek (struct qemud_server *server ATTRIBUTE_UNUSED, ret->buffer.buffer_len = size; if (VIR_ALLOC_N (ret->buffer.buffer_val, size) < 0) { - char ebuf[1024]; virDomainFree (dom); - remoteDispatchFormatError (rerr, "%s", - virStrerror(errno, ebuf, sizeof ebuf)); + remoteDispatchOOMError(rerr); return -1; } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 918a5d7..28bee54 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3431,8 +3431,10 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn, goto error; if (n) { obj->nvcpupids = n; - if (VIR_REALLOC_N(obj->vcpupids, obj->nvcpupids) < 0) + if (VIR_REALLOC_N(obj->vcpupids, obj->nvcpupids) < 0) { + virReportOOMError(conn); goto error; + } for (i = 0 ; i < n ; i++) { char *pidstr = virXMLPropString(nodes[i], "pid"); diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index c2c5a44..c5083cc 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -1057,13 +1057,18 @@ virNodeDeviceDefParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt, int create /* Extract device name */ if (create == EXISTING_DEVICE) { def->name = virXPathString(conn, "string(./name[1])", ctxt); + + if (!def->name) { + virNodeDeviceReportError(conn, VIR_ERR_NO_NAME, NULL); + goto error; + } } else { def->name = strdup("new device"); - } - if (!def->name) { - virNodeDeviceReportError(conn, VIR_ERR_NO_NAME, NULL); - goto error; + if (!def->name) { + virReportOOMError(conn); + goto error; + } } /* Extract device parent, if any */ diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 93fb5a9..f81f744 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2262,6 +2262,7 @@ esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) esxVI_DynamicProperty *dynamicProperty = NULL; esxVI_VirtualMachinePowerState powerState; int count = 0; + int i; if (names == NULL || maxnames < 0) { goto failure; @@ -2329,6 +2330,10 @@ esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) return count; failure: + for (i = 0; i < count; ++i) { + VIR_FREE(names[i]); + } + count = -1; goto cleanup; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 0fd7a17..f44901c 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -445,6 +445,9 @@ static char *lxcGetOSType(virDomainPtr dom) ret = strdup(vm->def->os.type); + if (ret == NULL) + virReportOOMError(dom->conn); + cleanup: if (vm) virDomainObjUnlock(vm); @@ -724,14 +727,18 @@ static int lxcSetupInterfaces(virConnectPtr conn, if (NULL == def->nets[i]->ifname) { def->nets[i]->ifname = strdup(parentVeth); } - if (VIR_REALLOC_N(*veths, (*nveths)+1) < 0) + if (VIR_REALLOC_N(*veths, (*nveths)+1) < 0) { + virReportOOMError(conn); goto error_exit; - if (((*veths)[(*nveths)++] = strdup(containerVeth)) == NULL) + } + if (((*veths)[(*nveths)] = strdup(containerVeth)) == NULL) { + virReportOOMError(conn); goto error_exit; + } + (*nveths)++; if (NULL == def->nets[i]->ifname) { - lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, - "%s", _("Failed to allocate veth names")); + virReportOOMError(conn); goto error_exit; } @@ -1771,13 +1778,19 @@ static int lxcVersion(virConnectPtr conn, unsigned long *version) return 0; } -static char *lxcGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, - int *nparams) +static char *lxcGetSchedulerType(virDomainPtr domain, int *nparams) { + char *schedulerType = NULL; + if (nparams) *nparams = 1; - return strdup("posix"); + schedulerType = strdup("posix"); + + if (schedulerType == NULL) + virReportOOMError(domain->conn); + + return schedulerType; } static int lxcSetSchedulerParameters(virDomainPtr domain, diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index c928afb..6eeece8 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -386,8 +386,8 @@ openvzReadFSConf(virConnectPtr conn, if (VIR_ALLOC(fs) < 0) goto no_memory; - if(virAsprintf(&veid_str, "%d", veid) < 0) - goto error; + if (virAsprintf(&veid_str, "%d", veid) < 0) + goto no_memory; fs->type = VIR_DOMAIN_FS_TYPE_MOUNT; fs->src = openvz_replace(temp, "$VEID", veid_str); @@ -547,8 +547,10 @@ openvzWriteConfigParam(const char * conf_file, const char *param, const char *va int fd = -1, temp_fd = -1; char line[PATH_MAX] ; - if (virAsprintf(&temp_file, "%s.tmp", conf_file)<0) + if (virAsprintf(&temp_file, "%s.tmp", conf_file)<0) { + virReportOOMError(NULL); return -1; + } fd = open(conf_file, O_RDONLY); if (fd == -1) @@ -733,8 +735,10 @@ openvzCopyDefaultConfig(int vpsid) if (confdir == NULL) goto cleanup; - if (virAsprintf(&default_conf_file, "%s/ve-%s.conf-sample", confdir, configfile_value) < 0) + if (virAsprintf(&default_conf_file, "%s/ve-%s.conf-sample", confdir, configfile_value) < 0) { + virReportOOMError(NULL); goto cleanup; + } if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0) goto cleanup; diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 53fcaee..467c03b 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -767,9 +767,11 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml) VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (vmdef->os.init == NULL && - !(vmdef->os.init = strdup("/sbin/init"))) { - goto cleanup; + if (vmdef->os.init == NULL) { + if (!(vmdef->os.init = strdup("/sbin/init"))) { + virReportOOMError(conn); + goto cleanup; + } } vm = virDomainFindByName(&driver->domains, vmdef->name); @@ -844,9 +846,12 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (vmdef->os.init == NULL && - !(vmdef->os.init = strdup("/sbin/init"))) - goto cleanup; + if (vmdef->os.init == NULL) { + if (!(vmdef->os.init = strdup("/sbin/init"))) { + virReportOOMError(conn); + goto cleanup; + } + } vm = virDomainFindByName(&driver->domains, vmdef->name); if (vm) { diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index a92046a..6aee504 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1732,7 +1732,8 @@ phypUUIDTable_ReadFile(virConnectPtr conn) goto err; } } - } + } else + virReportOOMError(conn); close(fd); return 0; @@ -1833,8 +1834,10 @@ phypUUIDTable_Init(virConnectPtr conn) VIR_WARN("%s %d", "Unable to generate UUID for domain", ids[i]); } - } else + } else { + virReportOOMError(conn); goto err; + } if (phypUUIDTable_WriteFile(conn) == -1) goto err; diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index e1e24c3..28567b2 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -417,17 +417,17 @@ qemudParseMachineTypesStr(const char *output, continue; if (VIR_ALLOC(machine) < 0) - goto error; + goto no_memory; if (!(machine->name = strndup(p, t - p))) { VIR_FREE(machine); - goto error; + goto no_memory; } if (VIR_REALLOC_N(list, nitems + 1) < 0) { VIR_FREE(machine->name); VIR_FREE(machine); - goto error; + goto no_memory; } p = t; @@ -446,7 +446,7 @@ qemudParseMachineTypesStr(const char *output, continue; if (!(machine->canonical = strndup(p, t - p))) - goto error; + goto no_memory; } } while ((p = next)); @@ -455,7 +455,8 @@ qemudParseMachineTypesStr(const char *output, return 0; -error: + no_memory: + virReportOOMError(NULL); virCapabilitiesFreeMachines(list, nitems); return -1; } @@ -537,23 +538,22 @@ qemudGetOldMachinesFromInfo(virCapsGuestDomainInfoPtr info, return 0; } - if (VIR_ALLOC_N(list, info->nmachines) < 0) + if (VIR_ALLOC_N(list, info->nmachines) < 0) { + virReportOOMError(NULL); return 0; + } for (i = 0; i < info->nmachines; i++) { if (VIR_ALLOC(list[i]) < 0) { - virCapabilitiesFreeMachines(list, info->nmachines); - return 0; + goto no_memory; } if (info->machines[i]->name && !(list[i]->name = strdup(info->machines[i]->name))) { - virCapabilitiesFreeMachines(list, info->nmachines); - return 0; + goto no_memory; } if (info->machines[i]->canonical && !(list[i]->canonical = strdup(info->machines[i]->canonical))) { - virCapabilitiesFreeMachines(list, info->nmachines); - return 0; + goto no_memory; } } @@ -561,6 +561,11 @@ qemudGetOldMachinesFromInfo(virCapsGuestDomainInfoPtr info, *nmachines = info->nmachines; return 1; + + no_memory: + virReportOOMError(NULL); + virCapabilitiesFreeMachines(list, info->nmachines); + return 0; } static int @@ -668,15 +673,19 @@ qemudCapsInitGuest(virCapsPtr caps, if (info->machine) { virCapsGuestMachinePtr machine; - if (VIR_ALLOC(machine) < 0) + if (VIR_ALLOC(machine) < 0) { + virReportOOMError(NULL); return -1; + } if (!(machine->name = strdup(info->machine))) { + virReportOOMError(NULL); VIR_FREE(machine); return -1; } if (VIR_ALLOC_N(machines, nmachines) < 0) { + virReportOOMError(NULL); VIR_FREE(machine->name); VIR_FREE(machine); return -1; @@ -1166,7 +1175,10 @@ qemudNetworkIfaceConnect(virConnectPtr conn, if (brname == NULL) return -1; } else if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { - brname = strdup(net->data.bridge.brname); + if (!(brname = strdup(net->data.bridge.brname))) { + virReportOOMError(conn); + return -1; + } } else { qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("Network type %d is not supported"), net->type); @@ -1276,12 +1288,15 @@ qemuAssignNetNames(virDomainDefPtr def, if (virAsprintf(&nic_name, "%s.%d", net->model ? net->model : "nic", - nic_index) < 0) + nic_index) < 0) { + virReportOOMError(NULL); return -1; + } if (virAsprintf(&hostnet_name, "%s.%d", qemuNetTypeToHostNet(net->type), hostnet_index) < 0) { + virReportOOMError(NULL); VIR_FREE(nic_name); return -1; } @@ -2434,7 +2449,7 @@ int qemudBuildCommandLine(virConnectPtr conn, hostdev->source.subsys.u.pci.function); if (ret < 0) { pcidev = NULL; - goto error; + goto no_memory; } ADD_ARG_LIT("-pcidevice"); ADD_ARG_LIT(pcidev); @@ -2589,6 +2604,7 @@ no_memory: for (i = 0 ; i < argcount ; i++) VIR_FREE(arglist[i]); VIR_FREE(arglist); + virReportOOMError(NULL); return -1; } @@ -3177,12 +3193,19 @@ qemuParseCommandLineChr(virConnectPtr conn, def->data.udp.connectHost = strndup(val, svc1-val); else def->data.udp.connectHost = strdup(val); + + if (!def->data.udp.connectHost) + goto no_memory; + if (svc1) { svc1++; if (host2) def->data.udp.connectService = strndup(svc1, host2-svc1); else def->data.udp.connectService = strdup(svc1); + + if (!def->data.udp.connectService) + goto no_memory; } if (host2) { @@ -3191,10 +3214,15 @@ qemuParseCommandLineChr(virConnectPtr conn, def->data.udp.bindHost = strndup(host2, svc2-host2); else def->data.udp.bindHost = strdup(host2); + + if (!def->data.udp.bindHost) + goto no_memory; } if (svc2) { svc2++; def->data.udp.bindService = strdup(svc2); + if (!def->data.udp.bindService) + goto no_memory; } } else if (STRPREFIX(val, "tcp:") || STRPREFIX(val, "telnet:")) { @@ -3217,12 +3245,16 @@ qemuParseCommandLineChr(virConnectPtr conn, def->data.tcp.listen = 1; def->data.tcp.host = strndup(val, svc-val); + if (!def->data.tcp.host) + goto no_memory; svc++; if (opt) { def->data.tcp.service = strndup(svc, opt-svc); } else { def->data.tcp.service = strdup(svc); } + if (!def->data.tcp.service) + goto no_memory; } else if (STRPREFIX(val, "unix:")) { const char *opt; val += strlen("unix:"); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5463951..f022f89 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -364,17 +364,13 @@ qemudSecurityCapsInit(virSecurityDriverPtr secdrv, caps->host.secModel.model = strdup(model); if (!caps->host.secModel.model) { - char ebuf[1024]; - VIR_ERROR(_("Failed to copy secModel model: %s"), - virStrerror(errno, ebuf, sizeof ebuf)); + virReportOOMError(NULL); return -1; } caps->host.secModel.doi = strdup(doi); if (!caps->host.secModel.doi) { - char ebuf[1024]; - VIR_ERROR(_("Failed to copy secModel DOI: %s"), - virStrerror(errno, ebuf, sizeof ebuf)); + virReportOOMError(NULL); return -1; } @@ -5851,8 +5847,10 @@ static struct qemuStreamMigFile *qemuStreamMigOpen(virStreamPtr st, int timeout = 3; int ret; - if (VIR_ALLOC(qemust) < 0) + if (VIR_ALLOC(qemust) < 0) { + virReportOOMError(st->conn); return NULL; + } qemust->fd = socket(AF_UNIX, SOCK_STREAM, 0); if (qemust->fd < 0) diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 66526dc..35cd330 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -201,8 +201,10 @@ qemuMonitorSend(const virDomainObjPtr vm, size_t len; int ret = -1; - if (virAsprintf(&full, "%s\r", cmd) < 0) + if (virAsprintf(&full, "%s\r", cmd) < 0) { + virReportOOMError(NULL); return -1; + } len = strlen(full); diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index ee7a046..c866111 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -870,12 +870,12 @@ doRemoteOpen (virConnectPtr conn, } if(VIR_ALLOC(priv->callbackList)<0) { - error(conn, VIR_ERR_INVALID_ARG, _("Error allocating callbacks list")); + virReportOOMError(conn); goto failed; } if(VIR_ALLOC(priv->domainEvents)<0) { - error(conn, VIR_ERR_INVALID_ARG, _("Error allocating domainEvents")); + virReportOOMError(conn); goto failed; } @@ -2751,9 +2751,18 @@ remoteListDefinedDomains (virConnectPtr conn, char **const names, int maxnames) * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -3086,7 +3095,7 @@ remoteDomainSetSchedulerParameters (virDomainPtr domain, /* Serialise the scheduler parameters. */ args.params.params_len = nparams; if (VIR_ALLOC_N(args.params.params_val, nparams) < 0) { - error (domain->conn, VIR_ERR_RPC, _("out of memory allocating array")); + virReportOOMError(domain->conn); goto done; } @@ -3432,9 +3441,18 @@ remoteListNetworks (virConnectPtr conn, char **const names, int maxnames) * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -3505,9 +3523,18 @@ remoteListDefinedNetworks (virConnectPtr conn, * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -3921,9 +3948,18 @@ remoteListInterfaces (virConnectPtr conn, char **const names, int maxnames) * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -3993,9 +4029,18 @@ remoteListDefinedInterfaces (virConnectPtr conn, char **const names, int maxname * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -4314,9 +4359,18 @@ remoteListStoragePools (virConnectPtr conn, char **const names, int maxnames) * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -4383,9 +4437,18 @@ remoteListDefinedStoragePools (virConnectPtr conn, * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -4890,9 +4953,18 @@ remoteStoragePoolListVolumes (virStoragePoolPtr pool, char **const names, int ma * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(pool->conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -5290,9 +5362,18 @@ static int remoteNodeListDevices(virConnectPtr conn, * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -5443,9 +5524,18 @@ static int remoteNodeDeviceListCaps(virNodeDevicePtr dev, * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.names.names_len; ++i) + for (i = 0; i < ret.names.names_len; ++i) { names[i] = strdup (ret.names.names_val[i]); + if (names[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(names[i]); + + virReportOOMError(dev->conn); + goto cleanup; + } + } + rv = ret.names.names_len; cleanup: @@ -6496,9 +6586,18 @@ remoteSecretListSecrets (virConnectPtr conn, char **uuids, int maxuuids) * names and the list of pointers, so we have to strdup the * names here. */ - for (i = 0; i < ret.uuids.uuids_len; ++i) + for (i = 0; i < ret.uuids.uuids_len; ++i) { uuids[i] = strdup (ret.uuids.uuids_val[i]); + if (uuids[i] == NULL) { + for (--i; i >= 0; --i) + VIR_FREE(uuids[i]); + + virReportOOMError(conn); + goto cleanup; + } + } + rv = ret.uuids.uuids_len; cleanup: @@ -6707,8 +6806,10 @@ remoteStreamOpen(virStreamPtr st, struct private_data *priv = st->conn->privateData; struct private_stream_data *stpriv; - if (VIR_ALLOC(stpriv) < 0) + if (VIR_ALLOC(stpriv) < 0) { + virReportOOMError(st->conn); return NULL; + } /* Initialize call object used to receive replies */ stpriv->proc_nr = proc_nr; @@ -7106,8 +7207,10 @@ prepareCall(virConnectPtr conn, struct remote_message_header hdr; struct remote_thread_call *rv; - if (VIR_ALLOC(rv) < 0) + if (VIR_ALLOC(rv) < 0) { + virReportOOMError(conn); return NULL; + } if (virCondInit(&rv->cond) < 0) { VIR_FREE(rv); diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c index 1d5b4f7..1eef468 100644 --- a/src/secret/secret_driver.c +++ b/src/secret/secret_driver.c @@ -449,8 +449,10 @@ secretLoad(virConnectPtr conn, virSecretDriverStatePtr driver, if (secretLoadValidateUUID(conn, def, xml_basename) < 0) goto cleanup; - if (VIR_ALLOC(secret) < 0) + if (VIR_ALLOC(secret) < 0) { + virReportOOMError(conn); goto cleanup; + } secret->def = def; def = NULL; @@ -578,8 +580,10 @@ secretListSecrets(virConnectPtr conn, char **uuids, int maxuuids) char *uuidstr; if (i == maxuuids) break; - if (VIR_ALLOC_N(uuidstr, VIR_UUID_STRING_BUFLEN) < 0) + if (VIR_ALLOC_N(uuidstr, VIR_UUID_STRING_BUFLEN) < 0) { + virReportOOMError(conn); goto cleanup; + } virUUIDFormat(secret->def->uuid, uuidstr); uuids[i] = uuidstr; i++; diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c index 6db51cd..6c2dce5 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -56,13 +56,16 @@ profile_status(const char *str, const int check_enforcing) int rc = -1; /* create string that is '<str> \0' for accurate matching */ - if (virAsprintf(&tmp, "%s ", str) == -1) + if (virAsprintf(&tmp, "%s ", str) == -1) { + virReportOOMError(NULL); return rc; + } if (check_enforcing != 0) { /* create string that is '<str> (enforce)\0' for accurate matching */ if (virAsprintf(&etmp, "%s (enforce)", str) == -1) { VIR_FREE(tmp); + virReportOOMError(NULL); return rc; } } diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index c70b1ed..4b181d7 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -326,6 +326,14 @@ getNewStyleBlockDevice(virConnectPtr conn, } *block_device = strdup(block_dirent->d_name); + + if (*block_device == NULL) { + virReportOOMError(conn); + closedir(block_dir); + retval = -1; + goto out; + } + VIR_DEBUG(_("Block device is '%s'"), *block_device); break; @@ -360,9 +368,16 @@ getOldStyleBlockDevice(virConnectPtr conn, blockp++; *block_device = strdup(blockp); + if (*block_device == NULL) { + virReportOOMError(conn); + retval = -1; + goto out; + } + VIR_DEBUG(_("Block device is '%s'"), *block_device); } +out: return retval; } diff --git a/src/util/conf.c b/src/util/conf.c index 2aa4a55..8126f69 100644 --- a/src/util/conf.c +++ b/src/util/conf.c @@ -388,6 +388,10 @@ virConfParseString(virConfParserCtxtPtr ctxt) return(NULL); } ret = strndup(base, ctxt->cur - base); + if (ret == NULL) { + virReportOOMError(NULL); + return NULL; + } NEXT; } else if ((ctxt->cur + 6 < ctxt->end) && (ctxt->cur[0] == '"') && (ctxt->cur[1] == '"') && (ctxt->cur[2] == '"')) { @@ -404,6 +408,10 @@ virConfParseString(virConfParserCtxtPtr ctxt) return(NULL); } ret = strndup(base, ctxt->cur - base); + if (ret == NULL) { + virReportOOMError(NULL); + return NULL; + } ctxt->cur += 3; } else if (CUR == '"') { NEXT; @@ -415,6 +423,10 @@ virConfParseString(virConfParserCtxtPtr ctxt) return(NULL); } ret = strndup(base, ctxt->cur - base); + if (ret == NULL) { + virReportOOMError(NULL); + return NULL; + } NEXT; } return(ret); @@ -857,11 +869,13 @@ virConfSetValue (virConfPtr conf, if (!cur) { if (VIR_ALLOC(cur) < 0) { + virReportOOMError(NULL); virConfFreeValue(value); return (-1); } cur->comment = NULL; if (!(cur->name = strdup(setting))) { + virReportOOMError(NULL); virConfFreeValue(value); VIR_FREE(cur); return (-1); diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index d29e424..0957809 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -1333,13 +1333,18 @@ cleanup: return ret; } -static char *vboxDomainGetOSType(virDomainPtr dom ATTRIBUTE_UNUSED) { +static char *vboxDomainGetOSType(virDomainPtr dom) { /* Returning "hvm" always as suggested on list, cause * this functions seems to be badly named and it * is supposed to pass the ABI name and not the domain * operating system driver as I had imagined ;) */ - return strdup("hvm"); + char *osType = strdup("hvm"); + + if (osType == NULL) + virReportOOMError(dom->conn); + + return osType; } static int vboxDomainSetMemory(virDomainPtr dom, unsigned long memory) { @@ -1881,7 +1886,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) { if (valueDisplayUtf8) sdlDisplay = strdup(valueDisplayUtf8); if (sdlDisplay == NULL) { - vboxError(dom->conn, VIR_ERR_SYSTEM_ERROR, "%s", "strdup failed"); + virReportOOMError(dom->conn); /* 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 @@ -1895,7 +1900,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) { if (valueDisplayUtf8) guiDisplay = strdup(valueDisplayUtf8); if (guiDisplay == NULL) { - vboxError(dom->conn, VIR_ERR_SYSTEM_ERROR, "%s", "strdup failed"); + virReportOOMError(dom->conn); /* 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 @@ -1932,7 +1937,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) { def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP; def->graphics[def->ngraphics]->data.desktop.display = strdup(getenv("DISPLAY")); if (def->graphics[def->ngraphics]->data.desktop.display == NULL) { - vboxError(dom->conn, VIR_ERR_SYSTEM_ERROR, "%s", "strdup failed"); + virReportOOMError(dom->conn); /* just don't go to cleanup yet as it is ok to have * display as NULL */ @@ -3983,6 +3988,11 @@ static int vboxDomainAttachDevice(virDomainPtr dom, const char *xml) { def->os.type = strdup("hvm"); + if (def->os.type == NULL) { + virReportOOMError(dom->conn); + goto cleanup; + } + dev = virDomainDeviceDefParse(dom->conn, data->caps, def, xml, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) { @@ -4176,6 +4186,11 @@ static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml) { def->os.type = strdup("hvm"); + if (def->os.type == NULL) { + virReportOOMError(dom->conn); + goto cleanup; + } + dev = virDomainDeviceDefParse(dom->conn, data->caps, def, xml, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) { diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 479db10..a83b764 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -138,14 +138,20 @@ xenDomainUsedCpus(virDomainPtr dom) if (xenUnifiedNodeGetInfo(dom->conn, &nodeinfo) < 0) return(NULL); - if (VIR_ALLOC_N(cpulist, priv->nbNodeCpus) < 0) + if (VIR_ALLOC_N(cpulist, priv->nbNodeCpus) < 0) { + virReportOOMError(dom->conn); goto done; - if (VIR_ALLOC_N(cpuinfo, nb_vcpu) < 0) + } + if (VIR_ALLOC_N(cpuinfo, nb_vcpu) < 0) { + virReportOOMError(dom->conn); goto done; + } cpumaplen = VIR_CPU_MAPLEN(VIR_NODEINFO_MAXCPUS(nodeinfo)); if (xalloc_oversized(nb_vcpu, cpumaplen) || - VIR_ALLOC_N(cpumap, nb_vcpu * cpumaplen) < 0) + VIR_ALLOC_N(cpumap, nb_vcpu * cpumaplen) < 0) { + virReportOOMError(dom->conn); goto done; + } if ((ncpus = xenUnifiedDomainGetVcpus(dom, cpuinfo, nb_vcpu, cpumap, cpumaplen)) >= 0) { diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c index e107d1e..f25629a 100644 --- a/src/xen/xen_hypervisor.c +++ b/src/xen/xen_hypervisor.c @@ -1114,11 +1114,15 @@ xenHypervisorGetSchedulerType(virDomainPtr domain, int *nparams) switch (op.u.getschedulerid.sched_id){ case XEN_SCHEDULER_SEDF: schedulertype = strdup("sedf"); + if (schedulertype == NULL) + virReportOOMError(domain->conn); if (nparams) *nparams = 6; break; case XEN_SCHEDULER_CREDIT: schedulertype = strdup("credit"); + if (schedulertype == NULL) + virReportOOMError(domain->conn); if (nparams) *nparams = 2; break; @@ -2755,6 +2759,7 @@ xenHypervisorDomainGetOSType (virDomainPtr dom) { xenUnifiedPrivatePtr priv; xen_getdomaininfo dominfo; + char *ostype = NULL; priv = (xenUnifiedPrivatePtr) dom->conn->privateData; if (priv->handle < 0) @@ -2774,8 +2779,14 @@ xenHypervisorDomainGetOSType (virDomainPtr dom) return (NULL); if (XEN_GETDOMAININFO_FLAGS(dominfo) & DOMFLAGS_HVM) - return strdup("hvm"); - return strdup("linux"); + ostype = strdup("hvm"); + else + ostype = strdup("linux"); + + if (ostype == NULL) + virReportOOMError(dom->conn); + + return ostype; } virDomainPtr diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c index aa3893a..a41711d 100644 --- a/src/xen/xen_inotify.c +++ b/src/xen/xen_inotify.c @@ -107,6 +107,7 @@ xenInotifyXenCacheLookup(virConnectPtr conn, if (!*name) { DEBUG0("Error getting dom from def"); + virReportOOMError(conn); return -1; } return 0; @@ -145,8 +146,7 @@ xenInotifyXendDomainsDirLookup(virConnectPtr conn, const char *filename, if (!memcmp(rawuuid, priv->configInfoList->doms[i]->uuid, VIR_UUID_BUFLEN)) { *name = strdup(priv->configInfoList->doms[i]->name); if (!*name) { - virXenInotifyError(NULL, VIR_ERR_INTERNAL_ERROR, - _("finding dom for %s"), uuid_str); + virReportOOMError(conn); return -1; } memcpy(uuid, priv->configInfoList->doms[i]->uuid, VIR_UUID_BUFLEN); @@ -159,8 +159,10 @@ xenInotifyXendDomainsDirLookup(virConnectPtr conn, const char *filename, return -1; } - if (!(*name = strdup(dom->name))) + if (!(*name = strdup(dom->name))) { + virReportOOMError(conn); return -1; + } memcpy(uuid, dom->uuid, VIR_UUID_BUFLEN); virDomainFree(dom); /* succeeded too find domain by uuid */ @@ -380,7 +382,7 @@ cleanup: * Returns 0 or -1 in case of error. */ virDrvOpenStatus -xenInotifyOpen(virConnectPtr conn ATTRIBUTE_UNUSED, +xenInotifyOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED) { @@ -397,8 +399,7 @@ xenInotifyOpen(virConnectPtr conn ATTRIBUTE_UNUSED, priv->useXenConfigCache = 0; if (VIR_ALLOC(priv->configInfoList) < 0) { - virXenInotifyError(NULL, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to allocate configInfoList")); + virReportOOMError(conn); return -1; } diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index f86e022..3c660be 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -1055,8 +1055,13 @@ xenDaemonDomainLookupByID(virConnectPtr xend, "%s", _("domain information incomplete, missing name")); goto error; } - if (domname) + if (domname) { *domname = strdup(name); + if (*domname == NULL) { + virReportOOMError(xend); + goto error; + } + } if (sexpr_uuid(uuid, root, "domain/uuid") < 0) { virXendError(xend, VIR_ERR_INTERNAL_ERROR, @@ -2946,8 +2951,10 @@ xenDaemonOpen(virConnectPtr conn, goto failed; } else if (STRCASEEQ (conn->uri->scheme, "http")) { if (conn->uri->port && - virAsprintf(&port, "%d", conn->uri->port) == -1) + virAsprintf(&port, "%d", conn->uri->port) == -1) { + virReportOOMError(conn); goto failed; + } if (xenDaemonOpen_tcp(conn, conn->uri->server ? conn->uri->server : "localhost", @@ -3164,6 +3171,9 @@ xenDaemonDomainGetOSType(virDomainPtr domain) type = strdup("linux"); } + if (type == NULL) + virReportOOMError(domain->conn); + sexpr_free(root); return(type); @@ -3959,6 +3969,10 @@ xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid) if (id >= 0) { if (!memcmp(uuid, ident, VIR_UUID_BUFLEN)) { name = strdup(*tmp); + + if (name == NULL) + virReportOOMError(conn); + break; } } @@ -3979,7 +3993,14 @@ xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid) id = sexpr_int(root, "domain/domid"); else id = -1; - name = domname ? strdup(domname) : NULL; + + if (domname) { + name = strdup(domname); + + if (name == NULL) + virReportOOMError(conn); + } + sexpr_free(root); } @@ -4308,8 +4329,7 @@ xenDaemonDomainSetAutostart(virDomainPtr domain, autonode->u.s.car->u.value = (autostart ? strdup("start") : strdup("ignore")); if (!(autonode->u.s.car->u.value)) { - virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("no memory")); + virReportOOMError(domain->conn); goto error; } @@ -4628,7 +4648,7 @@ error: static int xenDaemonListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) { struct sexpr *root = NULL; - int ret = -1; + int i, ret = -1; struct sexpr *_for_i, *node; xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData; @@ -4651,12 +4671,19 @@ xenDaemonListDefinedDomains(virConnectPtr conn, char **const names, int maxnames if (node->kind != SEXPR_VALUE) continue; - names[ret++] = strdup(node->u.value); + if ((names[ret++] = strdup(node->u.value)) == NULL) { + virReportOOMError(conn); + goto error; + } + if (ret >= maxnames) break; } error: + for (i = 0; i < ret; ++i) + VIR_FREE(names[i]); + sexpr_free(root); return(ret); } @@ -4708,14 +4735,14 @@ xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams) if (STREQ (ret, "credit")) { schedulertype = strdup("credit"); if (schedulertype == NULL){ - virXendError(domain->conn, VIR_ERR_SYSTEM_ERROR, "%s", _("strdup failed")); + virReportOOMError(domain->conn); goto error; } *nparams = XEN_SCHED_CRED_NPARAM; } else if (STREQ (ret, "sedf")) { schedulertype = strdup("sedf"); if (schedulertype == NULL){ - virXendError(domain->conn, VIR_ERR_SYSTEM_ERROR, "%s", _("strdup failed")); + virReportOOMError(domain->conn); goto error; } *nparams = XEN_SCHED_SEDF_NPARAM; diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index 5e8931e..5878ba1 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -689,8 +689,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { int i; const char *defaultArch, *defaultMachine; - if (VIR_ALLOC(def) < 0) + if (VIR_ALLOC(def) < 0) { + virReportOOMError(conn); return NULL; + } def->virtType = VIR_DOMAIN_VIRT_XEN; def->id = -1; @@ -1100,7 +1102,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { } if (VIR_ALLOC(net) < 0) - goto cleanup; + goto no_memory; if (mac[0]) { unsigned int rawmac[6]; @@ -1234,7 +1236,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { goto skippci; if (VIR_ALLOC(hostdev) < 0) - goto cleanup; + goto no_memory; hostdev->managed = 0; hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; @@ -1922,8 +1924,10 @@ static int xenXMConfigSetInt(virConfPtr conf, const char *setting, long l) { virConfValuePtr value = NULL; - if (VIR_ALLOC(value) < 0) + if (VIR_ALLOC(value) < 0) { + virReportOOMError(NULL); return -1; + } value->type = VIR_CONF_LONG; value->next = NULL; @@ -1937,13 +1941,16 @@ static int xenXMConfigSetString(virConfPtr conf, const char *setting, const char *str) { virConfValuePtr value = NULL; - if (VIR_ALLOC(value) < 0) + if (VIR_ALLOC(value) < 0) { + virReportOOMError(NULL); return -1; + } value->type = VIR_CONF_STRING; value->next = NULL; if (!(value->str = strdup(str))) { VIR_FREE(value); + virReportOOMError(NULL); return -1; } @@ -2133,8 +2140,10 @@ xenXMDomainConfigFormatPCI(virConnectPtr conn, if (!hasPCI) return 0; - if (VIR_ALLOC(pciVal) < 0) + if (VIR_ALLOC(pciVal) < 0) { + virReportOOMError(conn); return -1; + } pciVal->type = VIR_CONF_LIST; pciVal->list = NULL; @@ -2149,8 +2158,10 @@ xenXMDomainConfigFormatPCI(virConnectPtr conn, def->hostdevs[i]->source.subsys.u.pci.domain, def->hostdevs[i]->source.subsys.u.pci.bus, def->hostdevs[i]->source.subsys.u.pci.slot, - def->hostdevs[i]->source.subsys.u.pci.function) < 0) + def->hostdevs[i]->source.subsys.u.pci.function) < 0) { + virReportOOMError(conn); goto error; + } if (VIR_ALLOC(val) < 0) { VIR_FREE(buf); @@ -2748,6 +2759,7 @@ cleanup: struct xenXMListIteratorContext { virConnectPtr conn; + int oom; int max; int count; char ** names; @@ -2757,13 +2769,18 @@ static void xenXMListIterator(void *payload ATTRIBUTE_UNUSED, const char *name, struct xenXMListIteratorContext *ctx = data; virDomainPtr dom = NULL; + if (ctx->oom) + return; + if (ctx->count == ctx->max) return; dom = xenDaemonLookupByName(ctx->conn, name); if (!dom) { - ctx->names[ctx->count] = strdup(name); - ctx->count++; + if (!(ctx->names[ctx->count] = strdup(name))) + ctx->oom = 1; + else + ctx->count++; } else { virDomainFree(dom); } @@ -2777,7 +2794,7 @@ static void xenXMListIterator(void *payload ATTRIBUTE_UNUSED, const char *name, int xenXMListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) { xenUnifiedPrivatePtr priv; struct xenXMListIteratorContext ctx; - int ret = -1; + int i, ret = -1; if (!VIR_IS_CONNECT(conn)) { xenXMError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); @@ -2794,11 +2811,21 @@ int xenXMListDefinedDomains(virConnectPtr conn, char **const names, int maxnames maxnames = virHashSize(priv->configCache); ctx.conn = conn; + ctx.oom = 0; ctx.count = 0; ctx.max = maxnames; ctx.names = names; virHashForEach(priv->nameConfigMap, xenXMListIterator, &ctx); + + if (ctx.oom) { + for (i = 0; i < ctx.count; i++) + VIR_FREE(ctx.names[i]); + + virReportOOMError(conn); + goto cleanup; + } + ret = ctx.count; cleanup: diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c index 0fabcf8..f8ef00b 100644 --- a/src/xen/xs_internal.c +++ b/src/xen/xs_internal.c @@ -305,17 +305,15 @@ xenStoreOpen(virConnectPtr conn, #ifndef PROXY /* Init activeDomainList */ if (VIR_ALLOC(priv->activeDomainList) < 0) { - virXenStoreError(NULL, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to allocate activeDomainList")); + virReportOOMError(conn); return -1; } /* Init watch list before filling in domInfoList, so we can know if it is the first time through when the callback fires */ - if ( VIR_ALLOC(priv->xsWatchList) < 0 ) { - virXenStoreError(NULL, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to allocate xsWatchList")); + if (VIR_ALLOC(priv->xsWatchList) < 0) { + virReportOOMError(conn); return -1; } @@ -892,7 +890,8 @@ xenStoreDomainGetOSTypeID(virConnectPtr conn, int id) { } if (str == NULL) str = strdup("linux"); - + if (str == NULL) + virReportOOMError(conn); return (str); } @@ -944,6 +943,10 @@ xenStoreDomainGetNetworkID(virConnectPtr conn, int id, const char *mac) { if (match) { ret = strdup(list[i]); + + if (ret == NULL) + virReportOOMError(conn); + break; } } @@ -995,15 +998,19 @@ xenStoreDomainGetDiskID(virConnectPtr conn, int id, const char *dev) { if (val == NULL) break; if ((devlen != len) || memcmp(val, dev, len)) { - free (val); + VIR_FREE (val); } else { ret = strdup(list[i]); - free (val); - free (list); + + if (ret == NULL) + virReportOOMError(conn); + + VIR_FREE (val); + VIR_FREE (list); return (ret); } } - free (list); + VIR_FREE (list); } snprintf(dir, sizeof(dir), "/local/domain/0/backend/tap/%d", id); list = xs_directory(priv->xshandle, 0, dir, &num); @@ -1014,15 +1021,19 @@ xenStoreDomainGetDiskID(virConnectPtr conn, int id, const char *dev) { if (val == NULL) break; if ((devlen != len) || memcmp(val, dev, len)) { - free (val); + VIR_FREE (val); } else { ret = strdup(list[i]); - free (val); - free (list); + + if (ret == NULL) + virReportOOMError(conn); + + VIR_FREE (val); + VIR_FREE (list); return (ret); } } - free (list); + VIR_FREE (list); } return (NULL); } @@ -1100,7 +1111,7 @@ int xenStoreAddWatch(virConnectPtr conn, xenStoreWatchCallback cb, void *opaque) { - xenStoreWatchPtr watch; + xenStoreWatchPtr watch = NULL; int n; xenStoreWatchListPtr list; xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData; @@ -1123,25 +1134,38 @@ int xenStoreAddWatch(virConnectPtr conn, } if (VIR_ALLOC(watch) < 0) - return -1; + goto no_memory; + watch->path = strdup(path); watch->token = strdup(token); watch->cb = cb; watch->opaque = opaque; + if (watch->path == NULL || watch->token == NULL) { + goto no_memory; + } + /* Make space on list */ n = list->count; if (VIR_REALLOC_N(list->watches, n + 1) < 0) { - virXenStoreError(NULL, VIR_ERR_INTERNAL_ERROR, - "%s", _("reallocating list")); - VIR_FREE(watch); - return -1; + goto no_memory; } list->watches[n] = watch; list->count++; return xs_watch(priv->xshandle, watch->path, watch->token); + + no_memory: + if (watch) { + VIR_FREE(watch->path); + VIR_FREE(watch->token); + VIR_FREE(watch); + } + + virReportOOMError(conn); + + return -1; } /* -- 1.6.0.4 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list