[libvirt] [PATCH] Add missing OOM error checks, reports and cleanups

Matthias Bolte matthias.bolte at googlemail.com
Sun Nov 8 21:40:42 UTC 2009


---
 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




More information about the libvir-list mailing list