[libvirt] PATCH: Convert lots of code to new memory APIs

Daniel P. Berrange berrange at redhat.com
Thu May 22 21:42:03 UTC 2008


This patch converts a large amount of the XML parsing/generating code in
the Xen and QEMU drivers over to using the new memory APIs, so we can get
OOM checking of it. In the process I've discovered and fixed a number of
double-free's, and leaks

 src/conf.c          |    5 -
 src/conf.h          |   18 ++--
 src/qemu_conf.c     |  134 +++++++++++++++---------------
 src/qemu_driver.c   |  114 ++++++++++++-------------
 src/test.c          |   94 ++++++++++-----------
 src/util.c          |   11 --
 src/xend_internal.c |  127 ++++++++++++++--------------
 src/xm_internal.c   |  229 +++++++++++++++++++++++++++-------------------------
 src/xml.c           |  100 +++++++++++-----------
 tests/virshtest.c   |   23 ++---
 10 files changed, 434 insertions(+), 421 deletions(-)


Dan.

diff -r 2069e1bf9132 src/conf.c
--- a/src/conf.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/conf.c	Thu May 22 17:39:03 2008 -0400
@@ -105,7 +105,6 @@
  *		Structures allocations and deallocations		*
  *									*
  ************************************************************************/
-static void virConfFreeValue(virConfValuePtr val);
 
 /**
  * virConfFreeList:
@@ -132,8 +131,8 @@
  *
  * Free a value
  */
-static void
-virConfFreeValue(virConfValuePtr val)
+void
+__virConfFreeValue(virConfValuePtr val)
 {
     if (val == NULL)
         return;
diff -r 2069e1bf9132 src/conf.h
--- a/src/conf.h	Thu May 22 14:22:39 2008 -0400
+++ b/src/conf.h	Thu May 22 17:39:03 2008 -0400
@@ -70,6 +70,7 @@
 virConfPtr	__virConfReadMem		(const char *memory,
                                          int len);
 int		__virConfFree		(virConfPtr conf);
+void            __virConfFreeValue      (virConfValuePtr val);
 
 virConfValuePtr	__virConfGetValue	(virConfPtr conf,
                                          const char *setting);
@@ -82,14 +83,15 @@
                                          int *len,
                                          virConfPtr conf);
 
-#define virConfNew() (__virConfNew())
-#define virConfReadFile(f) (__virConfReadFile((f)))
-#define virConfReadMem(m,l) (__virConfReadMem((m),(l)))
-#define virConfFree(c) (__virConfFree((c)))
-#define virConfGetValue(c,s) (__virConfGetValue((c),(s)))
-#define virConfSetValue(c,s,v) (__virConfSetValue((c),(s),(v)))
-#define virConfWriteFile(f,c) (__virConfWriteFile((f),(c)))
-#define virConfWriteMem(m,l,c) (__virConfWriteMem((m),(l),(c)))
+#define virConfNew() __virConfNew()
+#define virConfReadFile(f) __virConfReadFile((f))
+#define virConfReadMem(m,l) __virConfReadMem((m),(l))
+#define virConfFree(c) __virConfFree((c))
+#define virConfFreeValue(v) __virConfFreeValue((v))
+#define virConfGetValue(c,s) __virConfGetValue((c),(s))
+#define virConfSetValue(c,s,v) __virConfSetValue((c),(s),(v))
+#define virConfWriteFile(f,c) __virConfWriteFile((f),(c))
+#define virConfWriteMem(m,l,c) __virConfWriteMem((m),(l),(c))
 
 #ifdef __cplusplus
 }
diff -r 2069e1bf9132 src/qemu_conf.c
--- a/src/qemu_conf.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/qemu_conf.c	Thu May 22 17:39:03 2008 -0400
@@ -122,7 +122,7 @@
     p = virConfGetValue (conf, "vnc_tls_x509_cert_dir");
     CHECK_TYPE ("vnc_tls_x509_cert_dir", VIR_CONF_STRING);
     if (p && p->str) {
-        free(driver->vncTLSx509certdir);
+        VIR_FREE(driver->vncTLSx509certdir);
         if (!(driver->vncTLSx509certdir = strdup(p->str))) {
             qemudReportError(NULL, NULL, NULL, VIR_ERR_NO_MEMORY,
                              "%s", _("failed to allocate vncTLSx509certdir"));
@@ -220,42 +220,42 @@
     while (disk) {
         struct qemud_vm_disk_def *prev = disk;
         disk = disk->next;
-        free(prev);
+        VIR_FREE(prev);
     }
     while (net) {
         struct qemud_vm_net_def *prev = net;
         net = net->next;
-        free(prev);
+        VIR_FREE(prev);
     }
     while (input) {
         struct qemud_vm_input_def *prev = input;
         input = input->next;
-        free(prev);
+        VIR_FREE(prev);
     }
     while (serial) {
         struct qemud_vm_chr_def *prev = serial;
         serial = serial->next;
-        free(prev);
+        VIR_FREE(prev);
     }
     while (parallel) {
         struct qemud_vm_chr_def *prev = parallel;
         parallel = parallel->next;
-        free(prev);
+        VIR_FREE(prev);
     }
     while (sound) {
         struct qemud_vm_sound_def *prev = sound;
         sound = sound->next;
-        free(prev);
+        VIR_FREE(prev);
     }
     xmlFree(def->keymap);
-    free(def);
+    VIR_FREE(def);
 }
 
 void qemudFreeVM(struct qemud_vm *vm) {
     qemudFreeVMDef(vm->def);
     if (vm->newDef)
         qemudFreeVMDef(vm->newDef);
-    free(vm);
+    VIR_FREE(vm);
 }
 
 
@@ -1418,8 +1418,8 @@
         }
 
         for (i = 0; i < obj->nodesetval->nodeNr; i++) {
-            struct qemud_vm_chr_def *chr = calloc(1, sizeof(*chr));
-            if (!chr) {
+            struct qemud_vm_chr_def *chr;
+            if (VIR_ALLOC(chr) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                                  "%s",
                                  _("failed to allocate space for char device"));
@@ -1427,7 +1427,7 @@
             }
 
             if (qemudParseCharXML(conn, chr, i, obj->nodesetval->nodeTab[i]) < 0) {
-                free(chr);
+                VIR_FREE(chr);
                 goto cleanup;
             }
             if (ndevs)
@@ -1620,7 +1620,7 @@
     int i;
     struct qemud_vm_def *def;
 
-    if (!(def = calloc(1, sizeof(*def)))) {
+    if (VIR_ALLOC(def) < 0) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for xmlXPathContext"));
         return NULL;
@@ -1660,8 +1660,7 @@
                          "%s", _("invalid domain type attribute"));
         goto error;
     }
-    free(prop);
-    prop = NULL;
+    VIR_FREE(prop);
 
 
     /* Extract domain name */
@@ -2033,14 +2032,14 @@
     if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
         (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
         for (i = 0; i < obj->nodesetval->nodeNr; i++) {
-            struct qemud_vm_disk_def *disk = calloc(1, sizeof(*disk));
-            if (!disk) {
+            struct qemud_vm_disk_def *disk;
+            if (VIR_ALLOC(disk) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                            "%s", _("failed to allocate space for disk string"));
                 goto error;
             }
             if (qemudParseDiskXML(conn, disk, obj->nodesetval->nodeTab[i]) < 0) {
-                free(disk);
+                VIR_FREE(disk);
                 goto error;
             }
             def->ndisks++;
@@ -2083,8 +2082,8 @@
         obj = xmlXPathEval(BAD_CAST "/domain/devices/console", ctxt);
         if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
             (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr == 1)) {
-            struct qemud_vm_chr_def *chr = calloc(1, sizeof(*chr));
-            if (!chr) {
+            struct qemud_vm_chr_def *chr;
+            if (VIR_ALLOC(chr) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                                  "%s",
                                  _("failed to allocate space for char device"));
@@ -2092,7 +2091,7 @@
             }
 
             if (qemudParseCharXML(conn, chr, 0, obj->nodesetval->nodeTab[0]) < 0) {
-                free(chr);
+                VIR_FREE(chr);
                 goto error;
             }
             def->nserials = 1;
@@ -2108,14 +2107,14 @@
         (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
         struct qemud_vm_net_def *prev = NULL;
         for (i = 0; i < obj->nodesetval->nodeNr; i++) {
-            struct qemud_vm_net_def *net = calloc(1, sizeof(*net));
-            if (!net) {
+            struct qemud_vm_net_def *net;
+            if (VIR_ALLOC(net) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                            "%s", _("failed to allocate space for net string"));
                 goto error;
             }
             if (qemudParseInterfaceXML(conn, net, obj->nodesetval->nodeTab[i]) < 0) {
-                free(net);
+                VIR_FREE(net);
                 goto error;
             }
             def->nnets++;
@@ -2136,20 +2135,20 @@
         (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
         struct qemud_vm_input_def *prev = NULL;
         for (i = 0; i < obj->nodesetval->nodeNr; i++) {
-            struct qemud_vm_input_def *input = calloc(1, sizeof(*input));
-            if (!input) {
+            struct qemud_vm_input_def *input;
+            if (VIR_ALLOC(input) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for input string"));
                 goto error;
             }
             if (qemudParseInputXML(conn, def, input, obj->nodesetval->nodeTab[i]) < 0) {
-                free(input);
+                VIR_FREE(input);
                 goto error;
             }
             /* Mouse + PS/2 is implicit with graphics, so don't store it */
             if (input->bus == QEMU_INPUT_BUS_PS2 &&
                 input->type == QEMU_INPUT_TYPE_MOUSE) {
-                free(input);
+                VIR_FREE(input);
                 continue;
             }
             def->ninputs++;
@@ -2171,17 +2170,17 @@
         struct qemud_vm_sound_def *prev = NULL;
         for (i = 0; i < obj->nodesetval->nodeNr; i++) {
 
-            struct qemud_vm_sound_def *sound = calloc(1, sizeof(*sound));
+            struct qemud_vm_sound_def *sound;
             struct qemud_vm_sound_def *check = def->sounds;
             int collision = 0;
-            if (!sound) {
+            if (VIR_ALLOC(sound) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for sound dev"));
                 goto error;
             }
             if (qemudParseSoundXML(conn, sound,
                                    obj->nodesetval->nodeTab[i]) < 0) {
-                free(sound);
+                VIR_FREE(sound);
                 goto error;
             }
 
@@ -2194,7 +2193,7 @@
                 check = check->next;
             }
             if (collision) {
-                free(sound);
+                VIR_FREE(sound);
                 continue;
             }
 
@@ -2223,8 +2222,7 @@
         }
 
         if (!hasPS2mouse) {
-            input = calloc(1, sizeof(*input));
-            if (!input) {
+            if (VIR_ALLOC(input) < 0) {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for input string"));
                 goto error;
@@ -2242,7 +2240,7 @@
     return def;
 
  error:
-    free(prop);
+    VIR_FREE(prop);
     xmlXPathFreeObject(obj);
     xmlXPathFreeContext(ctxt);
     qemudFreeVMDef(def);
@@ -2264,7 +2262,6 @@
     char *retval = NULL;
     int err;
     int tapfd = -1;
-    int *tapfds;
 
     if (net->type == QEMUD_NET_NETWORK) {
         if (!(network = qemudFindNetworkByName(driver, net->dst.network.name))) {
@@ -2321,10 +2318,9 @@
     if (!(retval = strdup(tapfdstr)))
         goto no_memory;
 
-    if (!(tapfds = realloc(vm->tapfds, sizeof(*tapfds) * (vm->ntapfds+2))))
-        goto no_memory;
-
-    vm->tapfds = tapfds;
+    if (VIR_ALLOC_N(vm->tapfds, vm->ntapfds+2) < 0)
+        goto no_memory;
+
     vm->tapfds[vm->ntapfds++] = tapfd;
     vm->tapfds[vm->ntapfds]   = -1;
 
@@ -2334,7 +2330,7 @@
     qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                      "%s", _("failed to allocate space for tapfds string"));
  error:
-    free(retval);
+    VIR_FREE(retval);
     if (tapfd != -1)
         close(tapfd);
     return NULL;
@@ -2831,14 +2827,14 @@
     /* Add sound hardware */
     if (sound) {
         int size = 100;
-        char *modstr = calloc(1, size+1);
-        if (!modstr)
+        char *modstr;
+        if (VIR_ALLOC_N(modstr, size+1) < 0)
             goto no_memory;
 
         while(sound && size > 0) {
             const char *model = qemudSoundModelToString(sound->model);
             if (!model) {
-                free(modstr);
+                VIR_FREE(modstr);
                 qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
                                  "%s", _("invalid sound model"));
                 goto error;
@@ -2870,14 +2866,14 @@
     if (vm->tapfds) {
         for (i = 0; vm->tapfds[i] != -1; i++)
             close(vm->tapfds[i]);
-        free(vm->tapfds);
+        VIR_FREE(vm->tapfds);
         vm->tapfds = NULL;
         vm->ntapfds = 0;
     }
     if (qargv) {
         for (i = 0 ; i < qargc ; i++)
-            free((qargv)[i]);
-        free(qargv);
+            VIR_FREE((qargv)[i]);
+        VIR_FREE(qargv);
     }
     return -1;
 }
@@ -2925,7 +2921,7 @@
     if (fd != -1)
         close(fd);
 
-    free(xml);
+    VIR_FREE(xml);
 
     return ret;
 }
@@ -2937,13 +2933,18 @@
 {
     xmlDocPtr xml;
     xmlNodePtr node;
-    struct qemud_vm_device_def *dev = calloc(1, sizeof(*dev));
+    struct qemud_vm_device_def *dev;
+
+    if (VIR_ALLOC(dev) < 0) {
+        qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, NULL);
+        return NULL;
+    }
 
     if (!(xml = xmlReadDoc(BAD_CAST xmlStr, "device.xml", NULL,
                            XML_PARSE_NOENT | XML_PARSE_NONET |
                            XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_XML_ERROR, NULL);
-        return NULL;
+        goto error;
     }
 
     node = xmlDocGetRootElement(xml);
@@ -2976,7 +2977,7 @@
 
   error:
     if (xml) xmlFreeDoc(xml);
-    free(dev);
+    VIR_FREE(dev);
     return NULL;
 }
 
@@ -3024,7 +3025,7 @@
         return vm;
     }
 
-    if (!(vm = calloc(1, sizeof(*vm)))) {
+    if (VIR_ALLOC(vm) < 0) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for vm string"));
         return NULL;
@@ -3152,7 +3153,7 @@
 
  cleanup:
 
-    free(xml);
+    VIR_FREE(xml);
 
     return ret;
 }
@@ -3161,17 +3162,17 @@
     struct qemud_dhcp_range_def *range = def->ranges;
     while (range) {
         struct qemud_dhcp_range_def *next = range->next;
-        free(range);
+        VIR_FREE(range);
         range = next;
     }
-    free(def);
+    VIR_FREE(def);
 }
 
 void qemudFreeNetwork(struct qemud_network *network) {
     qemudFreeNetworkDef(network->def);
     if (network->newDef)
         qemudFreeNetworkDef(network->newDef);
-    free(network);
+    VIR_FREE(network);
 }
 
 static int qemudParseBridgeXML(struct qemud_driver *driver ATTRIBUTE_UNUSED,
@@ -3224,7 +3225,7 @@
             continue;
         }
 
-        if (!(range = calloc(1, sizeof(*range)))) {
+        if (VIR_ALLOC(range) < 0) {
             qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for range string"));
             return 0;
@@ -3244,7 +3245,7 @@
             def->ranges = range;
             def->nranges++;
         } else {
-            free(range);
+            VIR_FREE(range);
         }
 
         xmlFree(start);
@@ -3315,7 +3316,7 @@
     xmlXPathObjectPtr obj = NULL, tmp = NULL;
     struct qemud_network_def *def;
 
-    if (!(def = calloc(1, sizeof(*def)))) {
+    if (VIR_ALLOC(def) < 0) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                    "%s", _("failed to allocate space for network_def string"));
         return NULL;
@@ -3489,7 +3490,7 @@
         return network;
     }
 
-    if (!(network = calloc(1, sizeof(*network)))) {
+    if (VIR_ALLOC(network) < 0) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                          "%s", _("failed to allocate space for network string"));
         return NULL;
@@ -3700,7 +3701,7 @@
         else
             qemudLoadNetworkConfig(driver, entry->d_name, path, xml, autostartLink);
 
-        free(xml);
+        VIR_FREE(xml);
     }
 
     closedir(dir);
@@ -3836,7 +3837,7 @@
     const struct qemud_vm_input_def *input;
     const struct qemud_vm_sound_def *sound;
     const struct qemud_vm_chr_def *chr;
-    const char *type = NULL;
+    const char *type = NULL, *tmp;
     int n, allones = 1;
 
     if (!(type = qemudVirtTypeToString(def->virtType))) {
@@ -3873,7 +3874,7 @@
             goto cleanup;
         }
         virBufferVSprintf(&buf, "  <vcpu cpuset='%s'>%d</vcpu>\n", cpumask, def->vcpus);
-        free(cpumask);
+        VIR_FREE(cpumask);
     }
 
     if (def->os.bootloader[0])
@@ -4113,7 +4114,8 @@
     qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                      "%s", _("failed to generate XML: out of memory"));
  cleanup:
-    free(virBufferContentAndReset(&buf));
+    tmp = virBufferContentAndReset(&buf);
+    VIR_FREE(tmp);
     return NULL;
 }
 
@@ -4124,6 +4126,7 @@
                               struct qemud_network_def *def) {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     unsigned char *uuid;
+    char *tmp;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     virBufferAddLit(&buf, "<network>\n");
@@ -4188,7 +4191,8 @@
  no_memory:
     qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                      "%s", _("failed to generate XML: out of memory"));
-    free(virBufferContentAndReset(&buf));
+    tmp = virBufferContentAndReset(&buf);
+    VIR_FREE(tmp);
     return NULL;
 }
 
diff -r 2069e1bf9132 src/qemu_driver.c
--- a/src/qemu_driver.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/qemu_driver.c	Thu May 22 17:39:03 2008 -0400
@@ -179,9 +179,8 @@
     char *base = NULL;
     char driverConf[PATH_MAX];
 
-    if (!(qemu_driver = calloc(1, sizeof(*qemu_driver)))) {
+    if (VIR_ALLOC(qemu_driver) < 0)
         return -1;
-    }
 
     /* Don't have a dom0 so start from 1 */
     qemu_driver->nextvmid = 1;
@@ -229,8 +228,7 @@
                   base) == -1)
         goto out_of_memory;
 
-    free(base);
-    base = NULL;
+    VIR_FREE(base);
 
     if ((qemu_driver->caps = qemudCapsInit()) == NULL)
         goto out_of_memory;
@@ -256,9 +254,8 @@
  out_of_memory:
     qemudLog (QEMUD_ERR,
               "%s", _("qemudStartup: out of memory"));
-    free (base);
-    free(qemu_driver);
-    qemu_driver = NULL;
+    VIR_FREE(base);
+    VIR_FREE(qemu_driver);
     return -1;
 }
 
@@ -361,19 +358,18 @@
     qemu_driver->nactivenetworks = 0;
     qemu_driver->ninactivenetworks = 0;
 
-    free(qemu_driver->configDir);
-    free(qemu_driver->autostartDir);
-    free(qemu_driver->networkConfigDir);
-    free(qemu_driver->networkAutostartDir);
-    free(qemu_driver->vncTLSx509certdir);
+    VIR_FREE(qemu_driver->configDir);
+    VIR_FREE(qemu_driver->autostartDir);
+    VIR_FREE(qemu_driver->networkConfigDir);
+    VIR_FREE(qemu_driver->networkAutostartDir);
+    VIR_FREE(qemu_driver->vncTLSx509certdir);
 
     if (qemu_driver->brctl)
         brShutdown(qemu_driver->brctl);
     if (qemu_driver->iptables)
         iptablesContextFree(qemu_driver->iptables);
 
-    free(qemu_driver);
-    qemu_driver = NULL;
+    VIR_FREE(qemu_driver);
 
     return 0;
 }
@@ -702,13 +698,13 @@
     if (lastVcpu != (vm->def->vcpus - 1))
         goto error;
 
-    free(qemucpus);
+    VIR_FREE(qemucpus);
     return 0;
 
 error:
     VIR_FREE(vm->vcpupids);
-    vm->vcpupids = 0;
-    free(qemucpus);
+    vm->nvcpupids = 0;
+    VIR_FREE(qemucpus);
 
     /* Explicitly return success, not error. Older KVM does
        not have vCPU -> Thread mapping info and we don't
@@ -757,7 +753,7 @@
                          "%s", _("resume operation failed"));
         return -1;
     }
-    free(info);
+    VIR_FREE(info);
 
     return 0;
 }
@@ -906,16 +902,15 @@
     }
 
     for (i = 0 ; argv[i] ; i++)
-        free(argv[i]);
-    free(argv);
+        VIR_FREE(argv[i]);
+    VIR_FREE(argv);
 
     if (vm->tapfds) {
         for (i = 0; vm->tapfds[i] != -1; i++) {
             close(vm->tapfds[i]);
             vm->tapfds[i] = -1;
         }
-        free(vm->tapfds);
-        vm->tapfds = NULL;
+        VIR_FREE(vm->tapfds);
         vm->ntapfds = 0;
     }
 
@@ -1006,8 +1001,7 @@
     vm->pid = -1;
     vm->id = -1;
     vm->state = VIR_DOMAIN_SHUTOFF;
-    free(vm->vcpupids);
-    vm->vcpupids = NULL;
+    VIR_FREE(vm->vcpupids);
     vm->nvcpupids = 0;
 
     if (vm->newDef) {
@@ -1059,7 +1053,7 @@
         (2 * network->def->nranges) + /* --dhcp-range 10.0.0.2,10.0.0.254 */
         1;  /* NULL */
 
-    if (!(*argv = calloc(len, sizeof(**argv))))
+    if (VIR_ALLOC_N(*argv, len) < 0)
         goto no_memory;
 
 #define APPEND_ARG(v, n, s) do {     \
@@ -1127,8 +1121,8 @@
  no_memory:
     if (argv) {
         for (i = 0; (*argv)[i]; i++)
-            free((*argv)[i]);
-        free(*argv);
+            VIR_FREE((*argv)[i]);
+        VIR_FREE(*argv);
     }
     qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                      "%s", _("failed to allocate space for dnsmasq argv"));
@@ -1156,8 +1150,8 @@
     ret = virExecNonBlock(conn, argv, &network->dnsmasqPid, -1, NULL, NULL);
 
     for (i = 0; argv[i]; i++)
-        free(argv[i]);
-    free(argv);
+        VIR_FREE(argv[i]);
+    VIR_FREE(argv);
 
     return ret;
 }
@@ -1626,7 +1620,6 @@
         for (;;) {
             char data[1024];
             int got = read(vm->monitor, data, sizeof(data));
-            char *b;
 
             if (got == 0)
                 goto error;
@@ -1637,10 +1630,9 @@
                     break;
                 goto error;
             }
-            if (!(b = realloc(buf, size+got+1)))
+            if (VIR_REALLOC_N(buf, size+got+1) < 0)
                 goto error;
 
-            buf = b;
             memmove(buf+size, data, got);
             buf[size+got] = '\0';
             size += got;
@@ -1674,7 +1666,7 @@
         if (safewrite(vm->logfile, buf, strlen(buf)) < 0)
             qemudLog(QEMUD_WARN, _("Unable to log VM console data: %s"),
                      strerror(errno));
-        free(buf);
+        VIR_FREE(buf);
     }
     return -1;
 }
@@ -2018,7 +2010,7 @@
     }
     vm->state = VIR_DOMAIN_PAUSED;
     qemudDebug("Reply %s", info);
-    free(info);
+    VIR_FREE(info);
     return 0;
 }
 
@@ -2046,7 +2038,7 @@
     }
     vm->state = VIR_DOMAIN_RUNNING;
     qemudDebug("Reply %s", info);
-    free(info);
+    VIR_FREE(info);
     return 0;
 }
 
@@ -2230,7 +2222,7 @@
         }
     }
 
-    if ((out = (char *)malloc(len + 1)) == NULL)
+    if (VIR_ALLOC_N(out, len + 1) < 0)
         return NULL;
 
     for (i = j = 0; in[i] != '\0'; i++) {
@@ -2339,7 +2331,7 @@
     if ((fd = open(path, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR)) < 0) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                          _("failed to create '%s'"), path);
-        free(xml);
+        VIR_FREE(xml);
         return -1;
     }
 
@@ -2347,7 +2339,7 @@
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("failed to write save header"));
         close(fd);
-        free(xml);
+        VIR_FREE(xml);
         return -1;
     }
 
@@ -2355,12 +2347,12 @@
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("failed to write xml"));
         close(fd);
-        free(xml);
+        VIR_FREE(xml);
         return -1;
     }
 
     close(fd);
-    free(xml);
+    VIR_FREE(xml);
 
     /* Migrate to file */
     safe_path = qemudEscapeShellArg(path);
@@ -2374,7 +2366,7 @@
                   "\"", safe_path) == -1) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("out of memory"));
-        free(safe_path);
+        VIR_FREE(safe_path);
         return -1;
     }
     free(safe_path);
@@ -2382,12 +2374,12 @@
     if (qemudMonitorCommand(driver, vm, command, &info) < 0) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("migrate operation failed"));
-        free(command);
+        VIR_FREE(command);
         return -1;
     }
 
-    free(info);
-    free(command);
+    VIR_FREE(info);
+    VIR_FREE(command);
 
     /* Shut it down */
     qemudShutdownVMDaemon(dom->conn, driver, vm);
@@ -2622,7 +2614,7 @@
         return -1;
     }
 
-    if ((xml = (char *)malloc(header.xml_len)) == NULL) {
+    if (VIR_ALLOC_N(xml, header.xml_len) < 0) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("out of memory"));
         close(fd);
@@ -2633,7 +2625,7 @@
         qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("failed to read XML"));
         close(fd);
-        free(xml);
+        VIR_FREE(xml);
         return -1;
     }
 
@@ -2642,10 +2634,10 @@
         qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("failed to parse XML"));
         close(fd);
-        free(xml);
+        VIR_FREE(xml);
         return -1;
     }
-    free(xml);
+    VIR_FREE(xml);
 
     /* Ensure the name and UUID don't already exist in an active VM */
     vm = qemudFindVMByUUID(driver, def->uuid);
@@ -2688,7 +2680,7 @@
                              "%s", _("failed to resume domain"));
             return -1;
         }
-        free(info);
+        VIR_FREE(info);
         vm->state = VIR_DOMAIN_RUNNING;
     }
 
@@ -2730,7 +2722,7 @@
 
  cleanup:
     for (i = 0 ; i < got ; i++)
-        free(names[i]);
+        VIR_FREE(names[i]);
     return -1;
 }
 
@@ -2830,10 +2822,10 @@
                       safe_path) == -1) {
             qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                              "%s", _("out of memory"));
-            free(safe_path);
+            VIR_FREE(safe_path);
             return -1;
         }
-        free(safe_path);
+        VIR_FREE(safe_path);
 
     } else if (asprintf(&cmd, "eject cdrom") == -1) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
@@ -2844,11 +2836,11 @@
     if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
                          "%s", _("cannot change cdrom media"));
-        free(cmd);
+        VIR_FREE(cmd);
         return -1;
     }
-    free(reply);
-    free(cmd);
+    VIR_FREE(reply);
+    VIR_FREE(cmd);
     strcpy(olddisk->src, newdisk->src);
     olddisk->type = newdisk->type;
     return 0;
@@ -2881,7 +2873,7 @@
     if (dev->type != QEMUD_DEVICE_DISK || dev->data.disk.device != QEMUD_DISK_CDROM) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
                          "%s", _("only CDROM disk devices can be attached"));
-        free(dev);
+        VIR_FREE(dev);
         return -1;
     }
 
@@ -2896,16 +2888,16 @@
     if (!disk) {
         qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
                          "%s", _("CDROM not attached, cannot change media"));
-        free(dev);
+        VIR_FREE(dev);
         return -1;
     }
 
     if (qemudDomainChangeCDROM(dom, vm, disk, &dev->data.disk) < 0) {
-        free(dev);
+        VIR_FREE(dev);
         return -1;
     }
 
-    free(dev);
+    VIR_FREE(dev);
     return 0;
 }
 
@@ -3243,7 +3235,7 @@
 
  cleanup:
     for (i = 0 ; i < got ; i++)
-        free(names[i]);
+        VIR_FREE(names[i]);
     return -1;
 }
 
@@ -3271,7 +3263,7 @@
 
  cleanup:
     for (i = 0 ; i < got ; i++)
-        free(names[i]);
+        VIR_FREE(names[i]);
     return -1;
 }
 
diff -r 2069e1bf9132 src/test.c
--- a/src/test.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/test.c	Thu May 22 17:39:03 2008 -0400
@@ -45,6 +45,7 @@
 #include "util.h"
 #include "uuid.h"
 #include "capabilities.h"
+#include "memory.h"
 
 /* Flags that determine the action to take on a shutdown or crash of a domain
  */
@@ -275,7 +276,7 @@
         testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain uuid"));
         goto error;
     }
-    free(str);
+    VIR_FREE(str);
 
 
     ret = virXPathLong("string(/domain/memory[1])", ctxt, &l);
@@ -309,30 +310,30 @@
     if (str != NULL) {
         if (!(onReboot = testRestartStringToFlag(str))) {
             testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain reboot behaviour"));
-            free(str);
+            VIR_FREE(str);
             goto error;
         }
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/on_poweroff[1])", ctxt);
     if (str != NULL) {
         if (!(onPoweroff = testRestartStringToFlag(str))) {
             testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain poweroff behaviour"));
-            free(str);
+            VIR_FREE(str);
             goto error;
         }
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/on_crash[1])", ctxt);
     if (str != NULL) {
         if (!(onCrash = testRestartStringToFlag(str))) {
             testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain crash behaviour"));
-            free(str);
+            VIR_FREE(str);
             goto error;
         }
-        free(str);
+        VIR_FREE(str);
     }
 
     for (i = 0 ; i < MAX_DOMAINS ; i++) {
@@ -348,7 +349,7 @@
     privconn->domains[handle].id = domid;
     strncpy(privconn->domains[handle].name, name, sizeof(privconn->domains[handle].name)-1);
     privconn->domains[handle].name[sizeof(privconn->domains[handle].name)-1] = '\0';
-    free(name);
+    VIR_FREE(name);
     name = NULL;
 
     if (memory > maxMem)
@@ -371,7 +372,7 @@
 
  error:
     xmlXPathFreeContext(ctxt);
-    free(name);
+    VIR_FREE(name);
     return (-1);
 }
 
@@ -464,7 +465,7 @@
         testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("network uuid"));
         goto error;
     }
-    free(str);
+    VIR_FREE(str);
 
 
     forward = virXPathBoolean("count(/network/forward) != 0", ctxt);
@@ -512,10 +513,10 @@
     privconn->networks[handle].name[sizeof(privconn->networks[handle].name)-1] = '\0';
     strncpy(privconn->networks[handle].bridge, bridge ? bridge : name, sizeof(privconn->networks[handle].bridge)-1);
     privconn->networks[handle].bridge[sizeof(privconn->networks[handle].bridge)-1] = '\0';
-    free(name);
+    VIR_FREE(name);
     name = NULL;
     if (bridge) {
-        free(bridge);
+        VIR_FREE(bridge);
         bridge = NULL;
     }
 
@@ -524,32 +525,32 @@
     if (forwardDev) {
         strncpy(privconn->networks[handle].forwardDev, forwardDev, sizeof(privconn->networks[handle].forwardDev)-1);
         privconn->networks[handle].forwardDev[sizeof(privconn->networks[handle].forwardDev)-1] = '\0';
-        free(forwardDev);
+        VIR_FREE(forwardDev);
     }
 
     strncpy(privconn->networks[handle].ipAddress, ipaddress, sizeof(privconn->networks[handle].ipAddress)-1);
     privconn->networks[handle].ipAddress[sizeof(privconn->networks[handle].ipAddress)-1] = '\0';
-    free(ipaddress);
+    VIR_FREE(ipaddress);
     strncpy(privconn->networks[handle].ipNetmask, ipnetmask, sizeof(privconn->networks[handle].ipNetmask)-1);
     privconn->networks[handle].ipNetmask[sizeof(privconn->networks[handle].ipNetmask)-1] = '\0';
-    free(ipnetmask);
+    VIR_FREE(ipnetmask);
     strncpy(privconn->networks[handle].dhcpStart, dhcpstart, sizeof(privconn->networks[handle].dhcpStart)-1);
     privconn->networks[handle].dhcpStart[sizeof(privconn->networks[handle].dhcpStart)-1] = '\0';
-    free(dhcpstart);
+    VIR_FREE(dhcpstart);
     strncpy(privconn->networks[handle].dhcpEnd, dhcpend, sizeof(privconn->networks[handle].dhcpEnd)-1);
     privconn->networks[handle].dhcpEnd[sizeof(privconn->networks[handle].dhcpEnd)-1] = '\0';
-    free(dhcpend);
+    VIR_FREE(dhcpend);
     xmlXPathFreeContext(ctxt);
     return (handle);
 
  error:
     xmlXPathFreeContext(ctxt);
-    free (forwardDev);
-    free(ipaddress);
-    free(ipnetmask);
-    free(dhcpstart);
-    free(dhcpend);
-    free(name);
+    VIR_FREE (forwardDev);
+    VIR_FREE(ipaddress);
+    VIR_FREE(ipnetmask);
+    VIR_FREE(dhcpstart);
+    VIR_FREE(dhcpend);
+    VIR_FREE(name);
     return (-1);
 }
 
@@ -601,8 +602,8 @@
 static int testOpenDefault(virConnectPtr conn) {
     int u;
     struct timeval tv;
-    testConnPtr privconn = malloc(sizeof(*privconn));
-    if (!privconn) {
+    testConnPtr privconn;
+    if (VIR_ALLOC(privconn) < 0) {
         testError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "testConn");
         return VIR_DRV_OPEN_ERROR;
     }
@@ -677,7 +678,9 @@
 
     offset = strrchr(relativeTo, '/');
     if ((baseLen = (offset-relativeTo+1))) {
-        char *absFile = malloc(baseLen + strlen(filename) + 1);
+        char *absFile;
+        if (VIR_ALLOC_N(absFile, baseLen + strlen(filename) + 1) < 0)
+            return NULL;
         strncpy(absFile, relativeTo, baseLen);
         absFile[baseLen] = '\0';
         strcat(absFile, filename);
@@ -697,8 +700,8 @@
     xmlNodePtr *domains, *networks = NULL;
     xmlXPathContextPtr ctxt = NULL;
     virNodeInfoPtr nodeInfo;
-    testConnPtr privconn = calloc(1, sizeof(*privconn));
-    if (!privconn) {
+    testConnPtr privconn;
+    if (VIR_ALLOC(privconn) < 0) {
         testError(NULL, NULL, NULL, VIR_ERR_NO_MEMORY, "testConn");
         return VIR_DRV_OPEN_ERROR;
     }
@@ -794,7 +797,7 @@
     if (str != NULL) {
         strncpy(nodeInfo->model, str, sizeof(nodeInfo->model)-1);
         nodeInfo->model[sizeof(nodeInfo->model)-1] = '\0';
-        free(str);
+        VIR_FREE(str);
     }
 
     ret = virXPathLong("string(/node/memory[1])", ctxt, &l);
@@ -815,21 +818,21 @@
         xmlChar *domFile = xmlGetProp(domains[i], BAD_CAST "file");
         char *absFile = testBuildFilename(file, (const char *)domFile);
         int domid = privconn->nextDomID++, handle;
-        free(domFile);
+        VIR_FREE(domFile);
         if (!absFile) {
             testError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("resolving domain filename"));
             goto error;
         }
         if ((handle = testLoadDomainFromFile(conn, domid, absFile)) < 0) {
-            free(absFile);
+            VIR_FREE(absFile);
             goto error;
         }
         privconn->domains[handle].config = 1;
-        free(absFile);
+        VIR_FREE(absFile);
         privconn->numDomains++;
     }
     if (domains != NULL) {
-        free(domains);
+        VIR_FREE(domains);
         domains = NULL;
     }
 
@@ -840,21 +843,21 @@
             xmlChar *netFile = xmlGetProp(networks[i], BAD_CAST "file");
             char *absFile = testBuildFilename(file, (const char *)netFile);
             int handle;
-            free(netFile);
+            VIR_FREE(netFile);
             if (!absFile) {
                 testError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("resolving network filename"));
                 goto error;
             }
             if ((handle = testLoadNetworkFromFile(conn, absFile)) < 0) {
-                free(absFile);
+                VIR_FREE(absFile);
                 goto error;
             }
             privconn->networks[handle].config = 1;
-            free(absFile);
+            VIR_FREE(absFile);
             privconn->numNetworks++;
         }
         if (networks != NULL) {
-            free(networks);
+            VIR_FREE(networks);
             networks = NULL;
         }
     }
@@ -866,13 +869,13 @@
 
  error:
     xmlXPathFreeContext(ctxt);
-    free(domains);
-    free(networks);
+    VIR_FREE(domains);
+    VIR_FREE(networks);
     if (xml)
         xmlFreeDoc(xml);
     if (fd != -1)
         close(fd);
-    free(privconn);
+    VIR_FREE(privconn);
     conn->privateData = NULL;
     return VIR_DRV_OPEN_ERROR;
 }
@@ -945,7 +948,7 @@
 static int testClose(virConnectPtr conn)
 {
     GET_CONNECTION(conn, -1);
-    free (privconn);
+    VIR_FREE (privconn);
     conn->privateData = conn;
     return 0;
 }
@@ -1361,11 +1364,11 @@
     if (safewrite(fd, xml, len) < 0) {
         testError(domain->conn, domain, NULL, VIR_ERR_INTERNAL_ERROR,
                   _("cannot write metadata"));
-        free(xml);
+        VIR_FREE(xml);
         close(fd);
         return (-1);
     }
-    free(xml);
+    VIR_FREE(xml);
     if (close(fd) < 0) {
         testError(domain->conn, domain, NULL, VIR_ERR_INTERNAL_ERROR,
                   _("cannot save domain data"));
@@ -1419,8 +1422,7 @@
         close(fd);
         return (-1);
     }
-    xml = malloc(len+1);
-    if (!xml) {
+    if (VIR_ALLOC_N(xml, len+1) < 0) {
         testError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "xml");
         close(fd);
         return (-1);
@@ -1435,7 +1437,7 @@
     close(fd);
     domid = privconn->nextDomID++;
     ret = testLoadDomainFromDoc(conn, domid, xml);
-    free(xml);
+    VIR_FREE(xml);
     return ret < 0 ? -1 : 0;
 }
 
diff -r 2069e1bf9132 src/util.c
--- a/src/util.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/util.c	Thu May 22 17:39:03 2008 -0400
@@ -48,7 +48,7 @@
 #include "event.h"
 #include "buf.h"
 #include "util.h"
-
+#include "memory.h"
 #include "util-lib.c"
 
 #ifndef MIN
@@ -303,19 +303,14 @@
         size_t requested;
 
         if (size + BUFSIZ + 1 > alloc) {
-            char *new_buf;
-
             alloc += alloc / 2;
             if (alloc < size + BUFSIZ + 1)
                 alloc = size + BUFSIZ + 1;
 
-            new_buf = realloc (buf, alloc);
-            if (!new_buf) {
+            if (VIR_ALLOC_N(buf, alloc) < 0) {
                 save_errno = errno;
                 break;
             }
-
-            buf = new_buf;
         }
 
         /* Ensure that (size + requested <= max_len); */
@@ -359,7 +354,7 @@
     }
 
     if (len > maxlen || (int)len != len) {
-        free(s);
+        VIR_FREE(s);
         virLog("File '%s' is too large %d, max %d",
                path, (int)len, maxlen);
         goto error;
diff -r 2069e1bf9132 src/xend_internal.c
--- a/src/xend_internal.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/xend_internal.c	Thu May 22 17:39:03 2008 -0400
@@ -44,6 +44,7 @@
 #include "xend_internal.h"
 #include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */
 #include "xs_internal.h" /* To extract VNC port & Serial console TTY */
+#include "memory.h"
 
 /* required for cpumap_t */
 #include <xen/dom0_ops.h>
@@ -630,7 +631,7 @@
 
     content = virBufferContentAndReset(&buf);
     ret = http2unix(xend, xend_post(xend, path, content, error, n_error));
-    free(content);
+    VIR_FREE(content);
 
     return ret;
 }
@@ -825,14 +826,15 @@
 urlencode(const char *string)
 {
     size_t len = strlen(string);
-    char *buffer = malloc(len * 3 + 1);
-    char *ptr = buffer;
+    char *buffer;
+    char *ptr;
     size_t i;
 
-    if (buffer == NULL) {
+    if (VIR_ALLOC_N(buffer, len * 3 + 1) < 0) {
         virXendError(NULL, VIR_ERR_NO_MEMORY, _("allocate new buffer"));
         return (NULL);
     }
+    ptr = buffer;
     for (i = 0; i < len; i++) {
         switch (string[i]) {
             case ' ':
@@ -909,6 +911,7 @@
 char *sound_string_to_xml(const char *sound) {
 
     virBuffer buf = VIR_BUFFER_INITIALIZER;
+    char *tmp;
 
     while (sound) {
         int modelsize, valid, collision = 0;
@@ -925,15 +928,16 @@
             if (STREQ(model, "all")) {
                 int i;
                 if (virBufferError(&buf)) {
-                    free(model);
-                    goto error;
-                }
-                free(virBufferContentAndReset(&buf));
+                    VIR_FREE(model);
+                    goto error;
+                }
+                tmp = virBufferContentAndReset(&buf);
+                VIR_FREE(tmp);
 
                 for (i=0; i < sizeof(sound_models)/sizeof(*sound_models); ++i)
                     virBufferVSprintf(&buf, "    <sound model='%s'/>\n",
                                       sound_models[i]);
-                free(model);
+                VIR_FREE(model);
                 break;
             }
         }
@@ -944,7 +948,7 @@
             virBufferVSprintf(&buf, "    <sound model='%s'/>\n", model);
 
         sound = (model_end ? ++model_end : NULL);
-        free(model);
+        VIR_FREE(model);
     }
 
     if (virBufferError(&buf))
@@ -952,7 +956,8 @@
     return virBufferContentAndReset(&buf);
 
   error:
-    free(virBufferContentAndReset(&buf));
+    tmp = virBufferContentAndReset(&buf);
+    VIR_FREE(tmp);
     return NULL;
 }
 
@@ -1092,8 +1097,7 @@
         count++;
     }
 
-    ptr = malloc((count + 1) * sizeof(char *) + extra);
-    if (ptr == NULL)
+    if (VIR_ALLOC_N(ptr, count + 1 + extra) < 0)
         goto error;
 
     ret = (char **) ptr;
@@ -1149,7 +1153,7 @@
     ret = xend_op(xend, "", "op", "create", "config", ptr, NULL);
 
     serrno = errno;
-    free(ptr);
+    VIR_FREE(ptr);
     errno = serrno;
 
     return ret;
@@ -1250,10 +1254,8 @@
 
 error:
     sexpr_free(root);
-    if (domname && *domname) {
-      free(*domname);
-      *domname = NULL;
-    }
+    if (domname)
+        VIR_FREE(*domname);
     return (-1);
 }
 
@@ -1694,11 +1696,11 @@
 
 error:
 
-    free(path);
-    free(bindHost);
-    free(bindPort);
-    free(connectHost);
-    free(connectPort);
+    VIR_FREE(path);
+    VIR_FREE(bindHost);
+    VIR_FREE(bindPort);
+    VIR_FREE(connectHost);
+    VIR_FREE(connectPort);
 
     return ret;
 }
@@ -1723,7 +1725,7 @@
 {
     struct sexpr *cur, *node;
     const char *tmp;
-    char *tty;
+    char *tty, *val;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     int hvm = 0, bootloader = 0, vfb = 0;
     int domid = -1;
@@ -1906,8 +1908,7 @@
                     goto bad_parse;
                 }
 
-                drvName = malloc((offset-src)+1);
-                if (!drvName) {
+                if (VIR_ALLOC_N(drvName, (offset-src)+1) < 0) {
                     virXendError(conn, VIR_ERR_NO_MEMORY,
                                  _("allocate new buffer"));
                     goto bad_parse;
@@ -1925,8 +1926,7 @@
                         goto bad_parse;
                     }
 
-                    drvType = malloc((offset-src)+1);
-                    if (!drvType) {
+                    if (VIR_ALLOC_N(drvType, (offset-src)+1)< 0) {
                         virXendError(conn, VIR_ERR_NO_MEMORY,
                                      _("allocate new buffer"));
                         goto bad_parse;
@@ -2004,8 +2004,8 @@
             virBufferAddLit(&buf, "    </disk>\n");
 
             bad_parse:
-            free(drvName);
-            free(drvType);
+            VIR_FREE(drvName);
+            VIR_FREE(drvType);
         } else if (sexpr_lookup(node, "device/vif")) {
             const char *tmp2, *model;
             tmp2 = sexpr_node(node, "device/vif/script");
@@ -2191,7 +2191,7 @@
         virBufferAddLit(&buf, "      <target port='0'/>\n");
         virBufferAddLit(&buf, "    </console>\n");
     }
-    free(tty);
+    VIR_FREE(tty);
 
     if (hvm) {
         if (sexpr_node(root, "domain/image/hvm/soundhw")) {
@@ -2200,7 +2200,7 @@
             if (tmp && *tmp) {
                 if ((soundxml = sound_string_to_xml(tmp))) {
                     virBufferVSprintf(&buf, "%s", soundxml);
-                    free(soundxml);
+                    VIR_FREE(soundxml);
                 } else {
                     virXendError(conn, VIR_ERR_INTERNAL_ERROR,
                                  _("parsing soundhw string failed."));
@@ -2221,7 +2221,8 @@
     return virBufferContentAndReset(&buf);
 
   error:
-    free(virBufferContentAndReset(&buf));
+    val = virBufferContentAndReset(&buf);
+    VIR_FREE(val);
     return (NULL);
 }
 
@@ -2379,11 +2380,9 @@
     numCpus = sexpr_int(root, "node/nr_cpus");
 
 
-    cpuset = malloc(numCpus * sizeof(*cpuset));
-    if (cpuset == NULL)
+    if (VIR_ALLOC_N(cpuset, numCpus) < 0)
         goto memory_error;
-    cpuNums = malloc(numCpus * sizeof(*cpuNums));
-    if (cpuNums == NULL)
+    if (VIR_ALLOC_N(cpuNums, numCpus) < 0)
         goto memory_error;
 
     cur = nodeToCpu;
@@ -2423,21 +2422,21 @@
                                            cpuNums) < 0)
             goto memory_error;
     }
-    free(cpuNums);
-    free(cpuset);
+    VIR_FREE(cpuNums);
+    VIR_FREE(cpuset);
     return (0);
 
   parse_error:
     virXendError(conn, VIR_ERR_XEN_CALL, _("topology syntax error"));
   error:
-    free(cpuNums);
-    free(cpuset);
+    VIR_FREE(cpuNums);
+    VIR_FREE(cpuset);
 
     return (-1);
 
   memory_error:
-    free(cpuNums);
-    free(cpuset);
+    VIR_FREE(cpuNums);
+    VIR_FREE(cpuset);
     virXendError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"));
     return (-1);
 }
@@ -3269,7 +3268,7 @@
     }
 
 error:
-        sexpr_free(root);
+    sexpr_free(root);
     return(ret);
 }
 
@@ -3302,7 +3301,7 @@
     }
 
 error:
-        sexpr_free(root);
+    sexpr_free(root);
     return(ret);
 }
 #endif /* ! PROXY */
@@ -3331,11 +3330,11 @@
     if (ret == NULL) return NULL;
 
     ret->id = id;
-    free(name);
+    VIR_FREE(name);
     return (ret);
 
  error:
-    free(name);
+    VIR_FREE(name);
     return (NULL);
 }
 
@@ -3543,7 +3542,7 @@
             }
             tmp++;
         }
-        free(names);
+        VIR_FREE(names);
     } else { /* New approach for xen >= 3.0.4 */
         char *domname = NULL;
         char uuidstr[VIR_UUID_STRING_BUFLEN];
@@ -3569,7 +3568,7 @@
     if (ret == NULL) return NULL;
 
     ret->id = id;
-    free(name);
+    VIR_FREE(name);
     return (ret);
 }
 
@@ -3610,14 +3609,14 @@
     if ((sexpr == NULL) || (name == NULL)) {
         virXendError(conn, VIR_ERR_XML_ERROR,
                      _("failed to parse domain description"));
-        free(sexpr);
-        free(name);
+        VIR_FREE(sexpr);
+        VIR_FREE(name);
 
         return (NULL);
     }
 
     ret = xenDaemonDomainCreateLinux(conn, sexpr);
-    free(sexpr);
+    VIR_FREE(sexpr);
     if (ret != 0) {
         goto error;
     }
@@ -3633,7 +3632,7 @@
     if ((ret = xenDaemonDomainResume(dom)) < 0)
         goto error;
 
-    free(name);
+    VIR_FREE(name);
 
     return (dom);
 
@@ -3643,7 +3642,7 @@
         xenDaemonDomainDestroy(dom);
         virUnrefDomain(dom);
     }
-    free(name);
+    VIR_FREE(name);
     return (NULL);
 }
 
@@ -3683,7 +3682,7 @@
     str = virDomainGetOSType(domain);
     if (STREQ(str, "hvm"))
         hvm = 1;
-    free(str);
+    VIR_FREE(str);
     sexpr = virParseXMLDevice(domain->conn, xml, hvm, priv->xendConfigVersion);
     if (sexpr == NULL)
         return (-1);
@@ -3702,7 +3701,7 @@
         ret = xend_op(domain->conn, domain->name, "op", "device_configure",
                       "config", conf, "dev", ref, NULL);
     }
-    free(sexpr);
+    VIR_FREE(sexpr);
     return ret;
 }
 
@@ -3810,7 +3809,7 @@
 
         // Change the autostart value in place, then define the new sexpr
         autonode = sexpr_lookup(root, "domain/on_xend_start");
-        free(autonode->u.s.car->u.value);
+        VIR_FREE(autonode->u.s.car->u.value);
         autonode->u.s.car->u.value = (autostart ? strdup("start")
                                                 : strdup("ignore"));
         if (!(autonode->u.s.car->u.value)) {
@@ -3996,7 +3995,7 @@
                    "port", port,
                    "resource", "0", /* required, xend ignores it */
                    NULL);
-    free (hostname);
+    VIR_FREE (hostname);
 
     DEBUG0("migration done");
 
@@ -4028,14 +4027,14 @@
     if ((sexpr == NULL) || (name == NULL)) {
         virXendError(conn, VIR_ERR_XML_ERROR,
                      _("failed to parse domain description"));
-        free(sexpr);
-        free(name);
+        VIR_FREE(sexpr);
+        VIR_FREE(name);
 
         return (NULL);
     }
 
     ret = xend_op(conn, "", "op", "new", "config", sexpr, NULL);
-    free(sexpr);
+    VIR_FREE(sexpr);
     if (ret != 0) {
         fprintf(stderr, _("Failed to create inactive domain %s\n"), name);
         goto error;
@@ -4048,7 +4047,7 @@
 
     return (dom);
   error:
-    free(name);
+    VIR_FREE(name);
     return (NULL);
 }
 int xenDaemonDomainCreate(virDomainPtr domain)
@@ -4318,7 +4317,7 @@
 
 error:
     sexpr_free(root);
-    free(sched_type);
+    VIR_FREE(sched_type);
     return (ret);
 }
 
@@ -4430,7 +4429,7 @@
 
 error:
     sexpr_free(root);
-    free(sched_type);
+    VIR_FREE(sched_type);
     return (ret);
 }
 
diff -r 2069e1bf9132 src/xm_internal.c
--- a/src/xm_internal.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/xm_internal.c	Thu May 22 17:39:03 2008 -0400
@@ -54,6 +54,7 @@
 #include "buf.h"
 #include "uuid.h"
 #include "util.h"
+#include "memory.h"
 
 static int xenXMConfigSetString(virConfPtr conf, const char *setting,
                                 const char *str);
@@ -241,16 +242,14 @@
     /* Had better have a name...*/
     if (xenXMConfigGetString(conf, "name", &name) < 0) {
         virConfValuePtr value;
-        value = malloc(sizeof(*value));
-        if (!value) {
+        if (VIR_ALLOC(value) < 0)
             return (-1);
-        }
 
         /* Set name based on filename */
         value->type = VIR_CONF_STRING;
         value->str = strdup(filename);
         if (!value->str) {
-            free(value);
+            VIR_FREE(value);
             return (-1);
         }
         if (virConfSetValue(conf, "name", value) < 0)
@@ -262,10 +261,8 @@
         virConfValuePtr value;
         char uuidstr[VIR_UUID_STRING_BUFLEN];
 
-        value = malloc(sizeof(*value));
-        if (!value) {
+        if (VIR_ALLOC(value) < 0)
             return (-1);
-        }
 
         /* ... then generate one */
         virUUIDGenerate(uuid);
@@ -274,7 +271,7 @@
         value->type = VIR_CONF_STRING;
         value->str = strdup(uuidstr);
         if (!value->str) {
-            free(value);
+            VIR_FREE(value);
             return (-1);
         }
 
@@ -289,7 +286,7 @@
 static void xenXMConfigFree(void *payload, const char *key ATTRIBUTE_UNUSED) {
     xenXMConfCachePtr entry = (xenXMConfCachePtr)payload;
     virConfFree(entry->conf);
-    free(entry);
+    VIR_FREE(entry);
 }
 
 
@@ -411,7 +408,7 @@
             entry->conf = NULL;
         } else { /* Completely new entry */
             newborn = 1;
-            if (!(entry = malloc(sizeof(*entry)))) {
+            if (VIR_ALLOC(entry) < 0) {
                 xenXMError (conn, VIR_ERR_NO_MEMORY, strerror (errno));
                 goto cleanup;
             }
@@ -424,7 +421,7 @@
             if (!newborn) {
                 virHashRemoveEntry(configCache, path, NULL);
             }
-            free(entry);
+            VIR_FREE(entry);
             continue;
         }
 
@@ -433,7 +430,7 @@
             if (!newborn) {
                 virHashRemoveEntry(configCache, path, NULL);
             }
-            free(entry);
+            VIR_FREE(entry);
             xenXMError (conn, VIR_ERR_INTERNAL_ERROR,
                         _("xenXMConfigCacheRefresh: name"));
             goto cleanup;
@@ -444,7 +441,7 @@
         if (newborn) {
             if (virHashAddEntry(configCache, entry->filename, entry) < 0) {
                 virConfFree(entry->conf);
-                free(entry);
+                VIR_FREE(entry);
                 xenXMError (conn, VIR_ERR_INTERNAL_ERROR,
                             _("xenXMConfigCacheRefresh: virHashAddEntry"));
                 goto cleanup;
@@ -458,7 +455,7 @@
             if (virHashAddEntry(nameConfigMap, domname, entry->filename) < 0) {
                 virHashRemoveEntry(configCache, ent->d_name, NULL);
                 virConfFree(entry->conf);
-                free(entry);
+                VIR_FREE(entry);
             }
         }
     }
@@ -674,7 +671,7 @@
         ranges = virConvertCpuSet(conn, str, 0);
         if (ranges != NULL) {
             virBufferVSprintf(&buf, " cpuset='%s'", ranges);
-            free(ranges);
+            VIR_FREE(ranges);
         } else
             virBufferVSprintf(&buf, " cpuset='%s'", str);
     }
@@ -1064,7 +1061,7 @@
             char *soundxml;
             if ((soundxml = sound_string_to_xml(str))) {
                 virBufferVSprintf(&buf, "%s", soundxml);
-                free(soundxml);
+                VIR_FREE(soundxml);
             } else {
                 xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
                            _("parsing soundhw string failed."));
@@ -1085,7 +1082,8 @@
     return virBufferContentAndReset(&buf);
 
   error:
-    free(virBufferContentAndReset(&buf));
+    str = virBufferContentAndReset(&buf);
+    VIR_FREE(str);
     return NULL;
 }
 
@@ -1140,7 +1138,7 @@
     if (!(entry = virHashLookup(configCache, filename)))
         return (-1);
 
-    if (!(value = malloc(sizeof(*value))))
+    if (VIR_ALLOC(value) < 0)
         return (-1);
 
     value->type = VIR_CONF_LONG;
@@ -1182,7 +1180,7 @@
     if (!(entry = virHashLookup(configCache, filename)))
         return (-1);
 
-    if (!(value = malloc(sizeof(*value))))
+    if (VIR_ALLOC(value) < 0)
         return (-1);
 
     value->type = VIR_CONF_LONG;
@@ -1255,7 +1253,7 @@
     if (!(entry = virHashLookup(configCache, filename)))
         return (-1);
 
-    if (!(value = malloc(sizeof(*value))))
+    if (VIR_ALLOC(value) < 0)
         return (-1);
 
     value->type = VIR_CONF_LONG;
@@ -1359,8 +1357,8 @@
     ret = 0;
 
  cleanup:
-    free(mapstr);
-    free(ranges);
+    VIR_FREE(mapstr);
+    VIR_FREE(ranges);
     return (ret);
 }
 
@@ -1494,13 +1492,13 @@
     priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
 
     if (!(sexpr = virDomainParseXMLDesc(domain->conn, xml, NULL, priv->xendConfigVersion))) {
-        free(xml);
+        VIR_FREE(xml);
         return (-1);
     }
-    free(xml);
+    VIR_FREE(xml);
 
     ret = xenDaemonDomainCreateLinux(domain->conn, sexpr);
-    free(sexpr);
+    VIR_FREE(sexpr);
     if (ret != 0) {
         return (-1);
     }
@@ -1531,7 +1529,7 @@
 int xenXMConfigSetInt(virConfPtr conf, const char *setting, long l) {
     virConfValuePtr value = NULL;
 
-    if (!(value = malloc(sizeof(*value))))
+    if (VIR_ALLOC(value) < 0)
         return -1;
 
     value->type = VIR_CONF_LONG;
@@ -1546,13 +1544,13 @@
 int xenXMConfigSetString(virConfPtr conf, const char *setting, const char *str) {
     virConfValuePtr value = NULL;
 
-    if (!(value = malloc(sizeof(*value))))
+    if (VIR_ALLOC(value) < 0)
         return -1;
 
     value->type = VIR_CONF_STRING;
     value->next = NULL;
     if (!(value->str = strdup(str))) {
-        free(value);
+        VIR_FREE(value);
         return -1;
     }
 
@@ -1635,7 +1633,8 @@
     ret = 0;
 
  error:
-    xmlXPathFreeObject(obj);
+    if (obj)
+        xmlXPathFreeObject(obj);
 
     return ret;
 }
@@ -1755,7 +1754,7 @@
 
     buflen += 2; /* mode */
 
-    if (!(buf = malloc(buflen)))
+    if (VIR_ALLOC_N(buf, buflen) < 0)
         goto cleanup;
 
     if(source) {
@@ -1884,7 +1883,7 @@
     if (ip)
         buflen += 4 + strlen((const char*)ip);
 
-    if (!(buf = malloc(buflen)))
+    if (VIR_ALLOC_N(buf, buflen) < 0)
         goto cleanup;
 
     strcpy(buf, "mac=");
@@ -1918,7 +1917,7 @@
     }
 
  cleanup:
-    free(bridge);
+    VIR_FREE(bridge);
     xmlFree(mac);
     xmlFree(source);
     xmlFree(script);
@@ -2007,18 +2006,18 @@
 
         ranges = virConvertCpuSet(conn, cpus, 0);
         if (ranges != NULL) {
-            free(cpus);
+            VIR_FREE(cpus);
             if (xenXMConfigSetString(conf, "cpus", ranges) < 0) {
-                free(ranges);
+                VIR_FREE(ranges);
                 goto error;
             }
-            free(ranges);
+            VIR_FREE(ranges);
         } else {
             if (xenXMConfigSetString(conf, "cpus", cpus) < 0) {
-                free(cpus);
+                VIR_FREE(cpus);
                 goto error;
             }
-            free(cpus);
+            VIR_FREE(cpus);
         }
     }
 
@@ -2027,6 +2026,7 @@
         (obj->stringval != NULL) && STREQ((char*)obj->stringval, "hvm"))
         hvm = 1;
     xmlXPathFreeObject(obj);
+    obj = NULL;
 
     priv = (xenUnifiedPrivatePtr) conn->privateData;
 
@@ -2051,6 +2051,7 @@
                 boot = "d";
         }
         xmlXPathFreeObject(obj);
+        obj = NULL;
         if (xenXMConfigSetString(conf, "boot", boot) < 0)
             goto error;
 
@@ -2073,6 +2074,7 @@
                 clockLocal = 1;
         }
         xmlXPathFreeObject(obj);
+        obj = NULL;
         if (xenXMConfigSetInt(conf, "localtime", clockLocal) < 0)
             goto error;
 
@@ -2160,7 +2162,7 @@
         obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics", ctxt);
         if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
             (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
-            if (!(vfb = malloc(sizeof(*vfb)))) {
+            if (VIR_ALLOC(vfb) < 0) {
                 xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
                 goto error;
             }
@@ -2192,40 +2194,49 @@
                         len += 11 + strlen((const char*)vncpasswd);
                     if (keymap)
                         len += 8 + strlen((const char*)keymap);
-                    if ((val = malloc(len)) != NULL) {
-                        strcpy(val, "type=vnc");
-                        if (vncunused) {
-                            strcat(val, ",vncunused=1");
-                        } else {
-                            char portstr[50];
-                            int port = atoi((const char*)vncport);
-                            snprintf(portstr, sizeof(portstr), "%d", port-5900);
-                            strcat(val, ",vncdisplay=");
-                            strcat(val, portstr);
-                        }
+                    if (VIR_ALLOC_N(val, len) < 0) {
+                        xmlFree(type);
                         xmlFree(vncport);
-                        if (vnclisten) {
-                            strcat(val, ",vnclisten=");
-                            strcat(val, (const char*)vnclisten);
-                            xmlFree(vnclisten);
-                        }
-                        if (vncpasswd) {
-                            strcat(val, ",vncpasswd=");
-                            strcat(val, (const char*)vncpasswd);
-                            xmlFree(vncpasswd);
-                        }
-                        if (keymap) {
-                            strcat(val, ",keymap=");
-                            strcat(val, (const char*)keymap);
-                            xmlFree(keymap);
-                        }
+                        xmlFree(vnclisten);
+                        xmlFree(vncpasswd);
+                        xmlFree(keymap);
+                        VIR_FREE(vfb);
+                        xenXMError (conn, VIR_ERR_NO_MEMORY, strerror (errno));
+                        goto error;
+                    }
+                    strcpy(val, "type=vnc");
+                    if (vncunused) {
+                        strcat(val, ",vncunused=1");
+                    } else {
+                        char portstr[50];
+                        int port = atoi((const char*)vncport);
+                        snprintf(portstr, sizeof(portstr), "%d", port-5900);
+                        strcat(val, ",vncdisplay=");
+                        strcat(val, portstr);
+                    }
+                    xmlFree(vncport);
+                    if (vnclisten) {
+                        strcat(val, ",vnclisten=");
+                        strcat(val, (const char*)vnclisten);
+                        xmlFree(vnclisten);
+                    }
+                    if (vncpasswd) {
+                        strcat(val, ",vncpasswd=");
+                        strcat(val, (const char*)vncpasswd);
+                        xmlFree(vncpasswd);
+                    }
+                    if (keymap) {
+                        strcat(val, ",keymap=");
+                        strcat(val, (const char*)keymap);
+                        xmlFree(keymap);
                     }
                 }
                 xmlFree(type);
                 if (val) {
                     virConfValuePtr disp;
-                    if (!(disp = malloc(sizeof(*disp)))) {
-                        free(val);
+                    if (VIR_ALLOC(disp) < 0) {
+                        VIR_FREE(val);
+                        VIR_FREE(vfb);
                         xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
                         goto error;
                     }
@@ -2246,7 +2257,7 @@
     if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
         (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
         virConfValuePtr disks;
-        if (!(disks = malloc(sizeof(*disks)))) {
+        if (VIR_ALLOC(disks) < 0) {
             xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
             goto error;
         }
@@ -2255,11 +2266,14 @@
         for (i = obj->nodesetval->nodeNr -1 ; i >= 0 ; i--) {
             virConfValuePtr thisDisk;
             char *disk = NULL;
-            if (xenXMParseXMLDisk(obj->nodesetval->nodeTab[i], hvm, priv->xendConfigVersion, &disk) < 0)
+            if (xenXMParseXMLDisk(obj->nodesetval->nodeTab[i], hvm, priv->xendConfigVersion, &disk) < 0) {
+                virConfFreeValue(disks);
                 goto error;
+            }
             if (disk) {
-                if (!(thisDisk = malloc(sizeof(*thisDisk)))) {
-                    free(disk);
+                if (VIR_ALLOC(thisDisk) < 0) {
+                    VIR_FREE(disk);
+                    virConfFreeValue(disks);
                     xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
                     goto error;
                 }
@@ -2278,7 +2292,7 @@
     if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
         (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
         virConfValuePtr vifs;
-        if (!(vifs = malloc(sizeof(*vifs)))) {
+        if (VIR_ALLOC(vifs) < 0) {
             xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
             goto error;
         }
@@ -2287,10 +2301,13 @@
         for (i = obj->nodesetval->nodeNr - 1; i >= 0; i--) {
             virConfValuePtr thisVif;
             char *vif = xenXMParseXMLVif(conn, obj->nodesetval->nodeTab[i], hvm);
-            if (!vif)
+            if (!vif) {
+                virConfFreeValue(vifs);
                 goto error;
-            if (!(thisVif = malloc(sizeof(*thisVif)))) {
-                free(vif);
+            }
+            if (VIR_ALLOC(thisVif) < 0) {
+                VIR_FREE(vif);
+                virConfFreeValue(vifs);
                 xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
                 goto error;
             }
@@ -2344,10 +2361,10 @@
             if (!(soundstr = virBuildSoundStringFromXML(conn, ctxt)))
                 goto error;
             if (xenXMConfigSetString(conf, "soundhw", soundstr) < 0) {
-                free(soundstr);
+                VIR_FREE(soundstr);
                 goto error;
             }
-            free(soundstr);
+            VIR_FREE(soundstr);
         }
     }
 
@@ -2463,7 +2480,7 @@
         goto error;
     }
 
-    if (!(entry = calloc(1, sizeof(*entry)))) {
+    if (VIR_ALLOC(entry) < 0) {
         xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
         goto error;
     }
@@ -2505,7 +2522,7 @@
     return (ret);
 
  error:
-    free(entry);
+    VIR_FREE(entry);
     if (conf)
         virConfFree(conf);
     return (NULL);
@@ -2712,7 +2729,7 @@
     ret = 0;
 
  cleanup:
-    free(domxml);
+    VIR_FREE(domxml);
     xmlXPathFreeObject(obj);
     xmlXPathFreeContext(ctxt);
     if (doc)
@@ -2803,11 +2820,11 @@
             list_val = list_val->next;
         }
     } else if (!list_item) {
-        if (!(list_item = calloc(1, sizeof(virConfValue))))
+        if (VIR_ALLOC(list_item) < 0)
             goto cleanup;
         list_item->type = VIR_CONF_LIST;
         if(virConfSetValue(entry->conf, "disk", list_item)) {
-            free(list_item);
+            VIR_FREE(list_item);
             goto cleanup;
         }
         list_val = NULL;
@@ -2817,7 +2834,7 @@
 
     if (!list_val) {
         /* insert */
-        if (!(list_val = malloc(sizeof(virConfValue))))
+        if (VIR_ALLOC(list_val) < 0)
             goto cleanup;
         list_val->type = VIR_CONF_STRING;
         list_val->next = NULL;
@@ -2828,7 +2845,7 @@
             prev->next = list_val;
     } else {
         /* configure */
-        free(list_val->str);
+        VIR_FREE(list_val->str);
         list_val->str = dev;
     }
 
@@ -2836,9 +2853,9 @@
     goto cleanup;
 
  cleanup:
-    free(type);
-    free(source);
-    free(target);
+    VIR_FREE(type);
+    VIR_FREE(source);
+    VIR_FREE(target);
 
     return (ret);
 }
@@ -2912,7 +2929,7 @@
 
             if (virMacAddrCompare (dommac, (const char *) mac) == 0) {
                 if (autoassign) {
-                    free(mac);
+                    VIR_FREE(mac);
                     mac = NULL;
                     if (!(mac = (xmlChar *)xenXMAutoAssignMac()))
                         goto cleanup;
@@ -2929,11 +2946,11 @@
             list_val = list_val->next;
         }
     } else if (!list_item) {
-        if (!(list_item = calloc(1, sizeof(virConfValue))))
+        if (VIR_ALLOC(list_item) < 0)
             goto cleanup;
         list_item->type = VIR_CONF_LIST;
         if(virConfSetValue(entry->conf, "vif", list_item)) {
-            free(list_item);
+            VIR_FREE(list_item);
             goto cleanup;
         }
         list_val = NULL;
@@ -2948,28 +2965,28 @@
             while (node_cur->next)
                 node_cur = node_cur->next;
 
-            if (!(node_tmp = calloc(1, sizeof(xmlNode))))
+            if (VIR_ALLOC(node_tmp) < 0)
                 goto node_cleanup;
             node_tmp->type = XML_ELEMENT_NODE;
-            if (!(node_tmp->name = malloc(4)))
+            if (VIR_ALLOC_N(node_tmp->name, 4) < 0)
                 goto node_cleanup;
             strcpy((char *)node_tmp->name, "mac");
             node_tmp->children = NULL;
 
-            if (!(attr_node = calloc(1, sizeof(xmlAttr))))
+            if (VIR_ALLOC(attr_node) < 0)
                 goto node_cleanup;
             attr_node->type = XML_ATTRIBUTE_NODE;
             attr_node->ns = NULL;
-            if (!(attr_node->name = malloc(8)))
+            if (VIR_ALLOC_N(attr_node->name, 8) < 0)
                 goto node_cleanup;
             strcpy((char *) attr_node->name, "address");
             node_tmp->properties = attr_node;
 
-            if (!(text_node = calloc(1, sizeof(xmlNode))))
+            if (VIR_ALLOC(text_node) < 0)
                 goto node_cleanup;
             text_node->type = XML_TEXT_NODE;
             text_node->_private = NULL;
-            if (!(text_node->name = malloc(8)))
+            if (VIR_ALLOC_N(text_node->name, 5) < 0)
                 goto node_cleanup;
             strcpy((char *) text_node->name, "text");
             text_node->children = NULL;
@@ -2989,7 +3006,7 @@
 
     if (!list_val) {
         /* insert */
-        if (!(list_val = malloc(sizeof(virConfValue))))
+        if (VIR_ALLOC(list_val) < 0)
             goto cleanup;
         list_val->type = VIR_CONF_STRING;
         list_val->next = NULL;
@@ -3000,7 +3017,7 @@
             prev->next = list_val;
     } else {
         /* configure */
-        free(list_val->str);
+        VIR_FREE(list_val->str);
         list_val->str = dev;
     }
 
@@ -3012,9 +3029,9 @@
     xmlFree(attr_node);
     xmlFree(text_node);
  cleanup:
-    free(type);
-    free(source);
-    free(mac);
+    VIR_FREE(type);
+    VIR_FREE(source);
+    VIR_FREE(mac);
 
     return (ret);
 }
@@ -3031,7 +3048,7 @@
 xenXMAutoAssignMac() {
     char *buf;
 
-    if (!(buf = malloc(18)))
+    if (VIR_ALLOC_N(buf, 18) < 0)
         return 0;
     srand((unsigned)time(NULL));
     sprintf(buf, "00:16:3e:%02x:%02x:%02x"
@@ -3198,13 +3215,13 @@
     else {
         if (!prev) {
             virConfValuePtr value;
-            if (!(value = calloc(1, sizeof(virConfValue))))
+            if (VIR_ALLOC(value) < 0)
                 goto cleanup;
             value->type = VIR_CONF_LIST;
             value->list = list_val->next;
             list_val->next = NULL;
             if (virConfSetValue(entry->conf, device, value)) {
-                free(value);
+                VIR_FREE(value);
                 goto cleanup;
             }
         } else
@@ -3223,9 +3240,9 @@
     xmlXPathFreeContext(ctxt);
     if (doc)
         xmlFreeDoc(doc);
-    free(domdevice);
-    free(key);
-    free(list_val);
+    VIR_FREE(domdevice);
+    VIR_FREE(key);
+    VIR_FREE(list_val);
 
     return (ret);
 }
diff -r 2069e1bf9132 src/xml.c
--- a/src/xml.c	Thu May 22 14:22:39 2008 -0400
+++ b/src/xml.c	Thu May 22 17:39:03 2008 -0400
@@ -28,6 +28,7 @@
 #include "xml.h"
 #include "buf.h"
 #include "util.h"
+#include "memory.h"
 #include "xs_internal.h"        /* for xenStoreDomainGetNetworkID */
 #include "xen_unified.h"
 #include "xend_internal.h"      /* for is_sound_* functions */
@@ -276,19 +277,18 @@
     if (maxcpu <= 0)
         maxcpu = 4096;
 
-    cpuset = calloc(maxcpu, sizeof(*cpuset));
-    if (cpuset == NULL) {
+    if (VIR_ALLOC_N(cpuset, maxcpu) < 0) {
         virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0);
         return(NULL);
     }
 
     ret = virParseCpuSet(conn, &cur, 0, cpuset, maxcpu);
     if (ret < 0) {
-        free(cpuset);
+        VIR_FREE(cpuset);
         return(NULL);
     }
     res = virSaveCpuSet(conn, cpuset, maxcpu);
-    free(cpuset);
+    VIR_FREE(cpuset);
     return (res);
 }
 
@@ -311,7 +311,7 @@
     char *sound;
     xmlNodePtr *nodes = NULL;
 
-    if (!(sound = calloc(1, size+1))) {
+    if (VIR_ALLOC_N(sound, size + 1) < 0) {
         virXMLError(conn, VIR_ERR_NO_MEMORY,
                     _("failed to allocate sound string"), 0);
         return NULL;
@@ -334,7 +334,7 @@
             if (!is_sound_model_valid(model)) {
                 virXMLError(conn, VIR_ERR_XML_ERROR,
                             _("unknown sound model type"), 0);
-                free(model);
+                VIR_FREE(model);
                 goto error;
             }
 
@@ -347,21 +347,21 @@
                 if (*sound && (size >= (strlen(model) + 1))) {
                     strncat(sound, ",", size--);
                 } else if (*sound || size < strlen(model)) {
-                    free(model);
+                    VIR_FREE(model);
                     continue;
                 }
                 strncat(sound, model, size);
                 size -= strlen(model);
             }
 
-            free(model);
+            VIR_FREE(model);
         }
     }
-    free(nodes);
+    VIR_FREE(nodes);
     return sound;
 
   error:
-    free(nodes);
+    VIR_FREE(nodes);
     return NULL;
 }
 #endif /* !PROXY */
@@ -592,11 +592,11 @@
 
     ret = obj->nodesetval->nodeNr;
     if (list != NULL) {
-        *list = malloc(ret * sizeof(**list));
-        if (*list == NULL) {
+        if (VIR_ALLOC_N(*list, ret) < 0) {
             virXMLError(NULL, VIR_ERR_NO_MEMORY,
                         _("allocate string array"),
                         ret * sizeof(**list));
+            ret = -1;
         } else {
             memcpy(*list, obj->nodesetval->nodeTab,
                    ret * sizeof(xmlNodePtr));
@@ -1028,7 +1028,7 @@
         fdfile = xmlGetProp(cur, BAD_CAST "file");
         if (fdfile != NULL) {
             virBufferVSprintf(buf, "(fda '%s')", fdfile);
-            free(fdfile);
+            VIR_FREE(fdfile);
         }
     }
 
@@ -1042,7 +1042,7 @@
         fdfile = xmlGetProp(cur, BAD_CAST "file");
         if (fdfile != NULL) {
             virBufferVSprintf(buf, "(fdb '%s')", fdfile);
-            free(fdfile);
+            VIR_FREE(fdfile);
         }
     }
 
@@ -1120,7 +1120,7 @@
             }
             xmlFree(bus);
         }
-        free(nodes);
+        VIR_FREE(nodes);
         nodes = NULL;
     }
 
@@ -1159,19 +1159,19 @@
         if (!(soundstr = virBuildSoundStringFromXML(conn, ctxt)))
             goto error;
         virBufferVSprintf(buf, "(soundhw '%s')", soundstr);
-        free(soundstr);
+        VIR_FREE(soundstr);
     }
 
     str = virXPathString("string(/domain/clock/@offset)", ctxt);
     if (str != NULL && STREQ(str, "localtime")) {
         virBufferAddLit(buf, "(localtime 1)");
     }
-    free(str);
+    VIR_FREE(str);
 
     return (0);
 
   error:
-    free(nodes);
+    VIR_FREE(nodes);
     return (-1);
 }
 
@@ -1533,7 +1533,7 @@
             }
             virNetworkFree(network);
             virBufferVSprintf(buf, "(bridge '%s')", bridge);
-            free(bridge);
+            VIR_FREE(bridge);
         }
     }
     if (script != NULL)
@@ -1580,7 +1580,7 @@
 {
     xmlDocPtr xml = NULL;
     xmlNodePtr node;
-    char *nam = NULL;
+    char *nam = NULL, *tmp;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     xmlChar *prop;
     xmlParserCtxtPtr pctxt;
@@ -1677,30 +1677,29 @@
          * it in a range format guaranteed to be understood by Xen.
          */
         if (maxcpu > 0) {
-            cpuset = malloc(maxcpu * sizeof(*cpuset));
-            if (cpuset != NULL) {
-                res = virParseCpuSet(conn, &cur, 0, cpuset, maxcpu);
-                if (res > 0) {
-                    ranges = virSaveCpuSet(conn, cpuset, maxcpu);
-                    if (ranges != NULL) {
-                        virBufferVSprintf(&buf, "(cpus '%s')", ranges);
-                        free(ranges);
-                    }
+            if (VIR_ALLOC_N(cpuset, maxcpu) < 0) {
+                virXMLError(conn, VIR_ERR_NO_MEMORY, xmldesc, 0);
+                goto error;
+            }
+            res = virParseCpuSet(conn, &cur, 0, cpuset, maxcpu);
+            if (res > 0) {
+                ranges = virSaveCpuSet(conn, cpuset, maxcpu);
+                if (ranges != NULL) {
+                    virBufferVSprintf(&buf, "(cpus '%s')", ranges);
+                    VIR_FREE(ranges);
                 }
-                free(cpuset);
-                if (res < 0)
-                    goto error;
-            } else {
-                virXMLError(conn, VIR_ERR_NO_MEMORY, xmldesc, 0);
             }
+            VIR_FREE(cpuset);
+            if (res < 0)
+                goto error;
         }
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/uuid[1])", ctxt);
     if (str != NULL) {
         virBufferVSprintf(&buf, "(uuid '%s')", str);
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/bootloader[1])", ctxt);
@@ -1711,7 +1710,7 @@
          * significant and should be discarded
          */
         bootloader = 1;
-        free(str);
+        VIR_FREE(str);
     } else if (virXPathNumber("count(/domain/bootloader)", ctxt, &f) == 0
                && (f > 0)) {
         virBufferAddLit(&buf, "(bootloader)");
@@ -1728,25 +1727,25 @@
          * ignore the bootloader_args value unless a bootloader was specified
          */
         virBufferVSprintf(&buf, "(bootloader_args '%s')", str);
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/on_poweroff[1])", ctxt);
     if (str != NULL) {
         virBufferVSprintf(&buf, "(on_poweroff '%s')", str);
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/on_reboot[1])", ctxt);
     if (str != NULL) {
         virBufferVSprintf(&buf, "(on_reboot '%s')", str);
-        free(str);
+        VIR_FREE(str);
     }
 
     str = virXPathString("string(/domain/on_crash[1])", ctxt);
     if (str != NULL) {
         virBufferVSprintf(&buf, "(on_crash '%s')", str);
-        free(str);
+        VIR_FREE(str);
     }
 
     if (!bootloader) {
@@ -1812,11 +1811,11 @@
             res = virDomainParseXMLDiskDesc(conn, nodes[i], &buf,
                                             hvm, xendConfigVersion);
             if (res != 0) {
-                free(nodes);
+                VIR_FREE(nodes);
                 goto error;
             }
         }
-        free(nodes);
+        VIR_FREE(nodes);
     }
 
     nb_nodes = virXPathNodeSet("/domain/devices/interface", ctxt, &nodes);
@@ -1827,12 +1826,12 @@
                 virDomainParseXMLIfDesc(conn, nodes[i], &buf, hvm,
                                         xendConfigVersion);
             if (res != 0) {
-                free(nodes);
+                VIR_FREE(nodes);
                 goto error;
             }
             virBufferAddLit(&buf, ")");
         }
-        free(nodes);
+        VIR_FREE(nodes);
     }
 
     /* New style PV graphics config xen >= 3.0.4,
@@ -1844,11 +1843,11 @@
             for (i = 0; i < nb_nodes; i++) {
                 res = virDomainParseXMLGraphicsDescVFB(conn, nodes[i], &buf);
                 if (res != 0) {
-                    free(nodes);
+                    VIR_FREE(nodes);
                     goto error;
                 }
             }
-            free(nodes);
+            VIR_FREE(nodes);
         }
     }
 
@@ -1862,7 +1861,7 @@
     if (name != NULL)
         *name = nam;
     else
-        free(nam);
+        VIR_FREE(nam);
 
     if (virBufferError(&buf)) {
         virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0);
@@ -1872,7 +1871,7 @@
     return virBufferContentAndReset(&buf);
 
   error:
-    free(nam);
+    VIR_FREE(nam);
     if (name != NULL)
         *name = NULL;
     xmlXPathFreeContext(ctxt);
@@ -1880,7 +1879,8 @@
         xmlFreeDoc(xml);
     if (pctxt != NULL)
         xmlFreeParserCtxt(pctxt);
-    free(virBufferContentAndReset(&buf));
+    tmp = virBufferContentAndReset(&buf);
+    VIR_FREE(tmp);
     return (NULL);
 }
 
diff -r 2069e1bf9132 tests/virshtest.c
--- a/tests/virshtest.c	Thu May 22 14:22:39 2008 -0400
+++ b/tests/virshtest.c	Thu May 22 17:39:04 2008 -0400
@@ -9,7 +9,7 @@
 #include "testutils.h"
 
 static char *progname;
-static char *abs_top_srcdir;
+static char *abs_srcdir;
 #define MAX_FILE 4096
 
 static int testFilterLine(char *buffer,
@@ -36,7 +36,7 @@
   char *actualPtr = &(actualData[0]);
   char expect[PATH_MAX];
 
-  snprintf(expect, sizeof expect - 1, "%s/tests/%s", abs_top_srcdir, expect_rel);
+  snprintf(expect, sizeof expect - 1, "%s/%s", abs_srcdir, expect_rel);
 
   if (virtTestLoadFile(expect, &expectPtr, MAX_FILE) < 0)
     return -1;
@@ -271,24 +271,25 @@
 
 
 
-int
-main(int argc, char **argv)
+static int
+mymain(int argc, char **argv)
 {
     int ret = 0;
     char buffer[PATH_MAX];
+    char cwd[PATH_MAX];
 
-    abs_top_srcdir = getenv("abs_top_srcdir");
-    if (!abs_top_srcdir)
-      return 1;
+    abs_srcdir = getenv("abs_srcdir");
+    if (!abs_srcdir)
+        abs_srcdir = getcwd(cwd, sizeof(cwd));
 
-    snprintf(buffer, PATH_MAX-1, "test://%s/docs/testnode.xml", abs_top_srcdir);
+    snprintf(buffer, PATH_MAX-1, "test://%s/../docs/testnode.xml", abs_srcdir);
     buffer[PATH_MAX-1] = '\0';
     progname = argv[0];
     custom_uri = buffer;
 
     if (argc > 1) {
         fprintf(stderr, "Usage: %s\n", progname);
-        exit(EXIT_FAILURE);
+        return(EXIT_FAILURE);
     }
 
     if (virtTestRun("virsh list (default)",
@@ -355,5 +356,7 @@
                     1, testCompareDomstateByName, NULL) != 0)
         ret = -1;
 
-    exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
+    return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }
+
+VIRT_TEST_MAIN(mymain)

-- 
|: Red Hat, Engineering, Boston   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list