WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] libxenlight: fix memory leaks

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] libxenlight: fix memory leaks
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sun, 22 Nov 2009 23:35:39 -0800
Delivery-date: Sun, 22 Nov 2009 23:37:27 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1258959894 0
# Node ID a986c3c5b163f9ac3d5bf44627418739f8921b0c
# Parent  9a78b081215832cbaf824a5e4ee10d7047d50535
libxenlight: fix memory leaks

In particular:

- all the temporary flexarrays allocated in the create
  device functions must be freed;

- all the strings that don't need to be modified can be added as they
  are
  to these temporary flexarrays instead of duplicating them;

- any data returned to the user shouldn't be added to the global
  memory tracker so that the user can free it whenever he wishes.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 tools/libxl/libxl.c          |  338 ++++++++++++++++++++++---------------------
 tools/libxl/libxl.h          |    9 -
 tools/libxl/libxl_device.c   |    5 
 tools/libxl/libxl_dom.c      |   11 -
 tools/libxl/libxl_internal.h |    7 
 tools/libxl/libxl_utils.c    |    6 
 tools/libxl/xl.c             |   17 +-
 7 files changed, 209 insertions(+), 184 deletions(-)

diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/libxl.c       Mon Nov 23 07:04:54 2009 +0000
@@ -180,33 +180,32 @@ retry_transaction:
     return 0;
 }
 
-libxl_domain_build_state *libxl_domain_build(struct libxl_ctx *ctx, 
libxl_domain_build_info *info, uint32_t domid)
-{
-    libxl_domain_build_state *state = (libxl_domain_build_state *) 
libxl_calloc(ctx, 1, sizeof(libxl_domain_build_state));
+int libxl_domain_build(struct libxl_ctx *ctx, libxl_domain_build_info *info, 
uint32_t domid, libxl_domain_build_state *state)
+{
     char **vments = NULL, **localents = NULL;
 
     build_pre(ctx, domid, info, state);
     if (info->hvm) {
         build_hvm(ctx, domid, info, state);
         vments = libxl_calloc(ctx, 5, sizeof(char *));
-        vments[0] = libxl_sprintf(ctx, "rtc/timeoffset");
-        vments[1] = libxl_sprintf(ctx, "%s", (info->u.hvm.timeoffset) ? 
info->u.hvm.timeoffset : "");
-        vments[2] = libxl_sprintf(ctx, "image/ostype");
-        vments[3] = libxl_sprintf(ctx, "hvm");
+        vments[0] = "rtc/timeoffset";
+        vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : "";
+        vments[2] = "image/ostype";
+        vments[3] = "hvm";
     } else {
         build_pv(ctx, domid, info, state);
         vments = libxl_calloc(ctx, 9, sizeof(char *));
-        vments[0] = libxl_sprintf(ctx, "image/ostype");
-        vments[1] = libxl_sprintf(ctx, "linux");
-        vments[2] = libxl_sprintf(ctx, "image/kernel");
-        vments[3] = libxl_sprintf(ctx, info->kernel);
-        vments[4] = libxl_sprintf(ctx, "image/ramdisk");
-        vments[5] = libxl_sprintf(ctx, info->u.pv.ramdisk);
-        vments[6] = libxl_sprintf(ctx, "image/cmdline");
-        vments[7] = libxl_sprintf(ctx, info->u.pv.cmdline);
+        vments[0] = "image/ostype";
+        vments[1] = "linux";
+        vments[2] = "image/kernel";
+        vments[3] = (char*) info->kernel;
+        vments[4] = "image/ramdisk";
+        vments[5] = (char*) info->u.pv.ramdisk;
+        vments[6] = "image/cmdline";
+        vments[7] = (char*) info->u.pv.cmdline;
     }
     build_post(ctx, domid, info, state, vments, localents);
-    return state;
+    return 0;
 }
 
 int libxl_domain_restore(struct libxl_ctx *ctx, libxl_domain_build_info *info,
@@ -221,15 +220,15 @@ int libxl_domain_restore(struct libxl_ct
     restore_common(ctx, domid, info, &state, fd);
     if (info->hvm) {
         vments = libxl_calloc(ctx, 4, sizeof(char *));
-        vments[0] = libxl_sprintf(ctx, "rtc/timeoffset");
-        vments[1] = libxl_sprintf(ctx, "%s", (info->u.hvm.timeoffset) ? 
info->u.hvm.timeoffset : "");
+        vments[0] = "rtc/timeoffset";
+        vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : "";
     } else {
         localents = libxl_calloc(ctx, 4 * 2, sizeof(char *));
-        localents[0] = libxl_sprintf(ctx, "serial/0/limit");
+        localents[0] = "serial/0/limit";
         localents[1] = libxl_sprintf(ctx, "%d", 65536);
-        localents[2] = libxl_sprintf(ctx, "console/port");
+        localents[2] = "console/port";
         localents[3] = libxl_sprintf(ctx, "%d", state.console_port);
-        localents[4] = libxl_sprintf(ctx, "console/ring-ref");
+        localents[4] = "console/ring-ref";
         localents[5] = libxl_sprintf(ctx, "%ld", state.console_mfn);
     }
     build_post(ctx, domid, info, &state, vments, localents);
@@ -245,7 +244,7 @@ struct libxl_dominfo * libxl_domain_list
 
     first_domain = 1;
     index = 0;
-    ptr = libxl_calloc(ctx, size, sizeof(struct libxl_dominfo));
+    ptr = calloc(size, sizeof(struct libxl_dominfo));
     if (!ptr)
         return NULL;
 redo:
@@ -254,13 +253,13 @@ redo:
         if (index == size) {
             struct libxl_dominfo *ptr2;
 
-            ptr2 = libxl_calloc(ctx, size * 2, sizeof(struct libxl_dominfo));
+            ptr2 = calloc(size * 2, sizeof(struct libxl_dominfo));
             if (!ptr2) {
-                libxl_free(ctx, ptr);
+                free(ptr);
                 return NULL;
             }
             memcpy(ptr2, ptr, sizeof(struct libxl_dominfo) * size);
-            libxl_free(ctx, ptr);
+            free(ptr);
             ptr = ptr2;
             size *= 2;
         }
@@ -283,7 +282,7 @@ xc_dominfo_t * libxl_domain_infolist(str
 
     first_domain = 0;
     index = 0;
-    info = (xc_dominfo_t *) libxl_calloc(ctx, size, sizeof(xc_dominfo_t));
+    info = (xc_dominfo_t *) calloc(size, sizeof(xc_dominfo_t));
     if (!info) {
         *nb_domain = 0;
         return NULL;
@@ -431,17 +430,17 @@ static char ** libxl_build_device_model_
     if (!dm_args)
         return NULL;
 
-    flexarray_set(dm_args, num++, libxl_sprintf(ctx, "qemu-dm"));
-    flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-d"));
+    flexarray_set(dm_args, num++, "qemu-dm");
+    flexarray_set(dm_args, num++, "-d");
 
     flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%d", info->domid));
 
     if (info->dom_name) {
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-domain-name"));
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s", 
info->dom_name));
+        flexarray_set(dm_args, num++, "-domain-name");
+        flexarray_set(dm_args, num++, info->dom_name);
     }
     if (info->vnc || info->vncdisplay || info->vnclisten || info->vncunused) {
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-vnc"));
+        flexarray_set(dm_args, num++, "-vnc");
         if (info->vncdisplay) {
             if (info->vnclisten && strchr(info->vnclisten, ':') == NULL) {
                 flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s:%d", 
info->vnclisten, info->vncdisplay));
@@ -450,63 +449,63 @@ static char ** libxl_build_device_model_
             }
         } else if (info->vnclisten) {
             if (strchr(info->vnclisten, ':') != NULL) {
-                flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s", 
info->vnclisten));
+                flexarray_set(dm_args, num++, info->vnclisten);
             } else {
                 flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s:0", 
info->vnclisten));
             }
         } else {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "127.0.0.1:0"));
+            flexarray_set(dm_args, num++, "127.0.0.1:0");
         }
         if (info->vncunused) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-vncunused"));
+            flexarray_set(dm_args, num++, "-vncunused");
         }
     }
     if (info->sdl || info->opengl) {
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-sdl"));
+        flexarray_set(dm_args, num++, "-sdl");
         if (info->opengl) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, 
"-disable-opengl"));
+            flexarray_set(dm_args, num++, "-disable-opengl");
         }
     }
     if (info->keymap) {
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-k"));
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s", info->keymap));
+        flexarray_set(dm_args, num++, "-k");
+        flexarray_set(dm_args, num++, info->keymap);
     }
     if (info->nographic && (!info->sdl && !info->vnc)) {
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-nographic"));
+        flexarray_set(dm_args, num++, "-nographic");
     }
     if (info->serial) {
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-serial"));
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s", info->serial));
+        flexarray_set(dm_args, num++, "-serial");
+        flexarray_set(dm_args, num++, info->serial);
     }
     if (info->type == XENFV) {
         if (info->videoram) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-videoram"));
+            flexarray_set(dm_args, num++, "-videoram");
             flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%d", 
info->videoram));
         }
         if (info->stdvga) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-std-vga"));
+            flexarray_set(dm_args, num++, "-std-vga");
         }
 
         if (info->boot) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-boot"));
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s", 
info->boot));
+            flexarray_set(dm_args, num++, "-boot");
+            flexarray_set(dm_args, num++, info->boot);
         }
         if (info->usb) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-usb"));
+            flexarray_set(dm_args, num++, "-usb");
             if (info->usbdevice) {
-                flexarray_set(dm_args, num++, libxl_sprintf(ctx, 
"-usbdevice"));
-                flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s", 
info->usbdevice));
+                flexarray_set(dm_args, num++, "-usbdevice");
+                flexarray_set(dm_args, num++, info->usbdevice);
             }
         }
         if (info->apic) {
-            flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-acpi"));
+            flexarray_set(dm_args, num++, "-acpi");
         }
         for (i = 0; i < num_vifs; i++) {
             if (vifs[i].nictype == NICTYPE_IOEMU) {
-                flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-net"));
+                flexarray_set(dm_args, num++, "-net");
                 flexarray_set(dm_args, num++, libxl_sprintf(ctx, 
"nic,vlan=%d,macaddr=%s,model=%s",
                             vifs[i].devid, vifs[i].smac, vifs[i].model));
-                flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-net"));
+                flexarray_set(dm_args, num++, "-net");
                 flexarray_set(dm_args, num++, libxl_sprintf(ctx, 
"tap,vlan=%d,ifname=%s,bridge=%s",
                             vifs[i].devid, vifs[i].ifname, vifs[i].bridge));
             }
@@ -514,11 +513,11 @@ static char ** libxl_build_device_model_
     }
     for (i = 0; info->extra && info->extra[i] != NULL; i++)
         flexarray_set(dm_args, num++, info->extra[i]);
-    flexarray_set(dm_args, num++, libxl_sprintf(ctx, "-M"));
+    flexarray_set(dm_args, num++, "-M");
     if (info->type == XENPV)
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "xenpv"));
+        flexarray_set(dm_args, num++, "xenpv");
     else
-        flexarray_set(dm_args, num++, libxl_sprintf(ctx, "xenfv"));
+        flexarray_set(dm_args, num++, "xenfv");
     flexarray_set(dm_args, num++, NULL);
 
     return (char **) flexarray_contents(dm_args);
@@ -590,8 +589,9 @@ int libxl_create_device_model(struct lib
     null = open("/dev/null", O_RDONLY);
 
     if (starting_r) {
+        rc = ERROR_NOMEM;
         *starting_r= libxl_calloc(ctx, sizeof(**starting_r), 1);
-        if (!*starting_r) return ERROR_NOMEM;
+        if (!*starting_r) goto xit;
         (*starting_r)->domid= info->domid;
 
         (*starting_r)->dom_path = libxl_xs_get_dompath(ctx, info->domid);
@@ -611,6 +611,7 @@ int libxl_create_device_model(struct lib
 
     rc = 0;
  xit:
+    free(args);
     close(null);
     close(logfile_w);
 
@@ -671,17 +672,17 @@ int libxl_device_disk_add(struct libxl_c
             int major, minor;
 
             device_physdisk_major_minor(disk->physpath, &major, &minor);
-            flexarray_set(back, boffset++, libxl_sprintf(ctx, 
"physical-device"));
+            flexarray_set(back, boffset++, "physical-device");
             flexarray_set(back, boffset++, libxl_sprintf(ctx, "%x:%x", major, 
minor));
 
-            flexarray_set(back, boffset++, libxl_sprintf(ctx, "params"));
-            flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", 
disk->physpath));
+            flexarray_set(back, boffset++, "params");
+            flexarray_set(back, boffset++, disk->physpath);
 
             device.backend_kind = DEVICE_VBD;
             break;
         }
         case PHYSTYPE_AIO: case PHYSTYPE_QCOW: case PHYSTYPE_QCOW2: case 
PHYSTYPE_VHD:
-            flexarray_set(back, boffset++, libxl_sprintf(ctx, "params"));
+            flexarray_set(back, boffset++, "params");
             flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s:%s",
                           device_disk_string_of_phystype(disk->phystype), 
disk->physpath));
 
@@ -689,41 +690,42 @@ int libxl_device_disk_add(struct libxl_c
             break;
     }
 
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "frontend-id"));
+    flexarray_set(back, boffset++, "frontend-id");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", disk->domid));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "online"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "1"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "removable"));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "removable");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 
(disk->unpluggable) ? 1 : 0));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "bootable"));
+    flexarray_set(back, boffset++, "bootable");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "dev"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", disk->virtpath));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "type"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", backend_type));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "mode"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", (disk->readwrite) 
? "w" : "r"));
-
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+    flexarray_set(back, boffset++, "dev");
+    flexarray_set(back, boffset++, disk->virtpath);
+    flexarray_set(back, boffset++, "type");
+    flexarray_set(back, boffset++, backend_type);
+    flexarray_set(back, boffset++, "mode");
+    flexarray_set(back, boffset++, disk->readwrite ? "w" : "r");
+
+    flexarray_set(front, foffset++, "backend-id");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
disk->backend_domid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(front, foffset++, "state");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "virtual-device"));
+    flexarray_set(front, foffset++, "virtual-device");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", devid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "device-type"));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "%s", (disk->is_cdrom) 
? "cdrom" : "disk"));
+    flexarray_set(front, foffset++, "device-type");
+    flexarray_set(front, foffset++, disk->is_cdrom ? "cdrom" : "disk");
 
     if (0 /* protocol != native*/) {
-        flexarray_set(front, foffset++, libxl_sprintf(ctx, "protocol"));
-        flexarray_set(front, foffset++, libxl_sprintf(ctx, "x86_32-abi")); /* 
hardcoded ! */
+        flexarray_set(front, foffset++, "protocol");
+        flexarray_set(front, foffset++, "x86_32-abi"); /* hardcoded ! */
     }
 
     libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
-    /* leaks both flexarray here */
+    flexarray_free(back);
+    flexarray_free(front);
     return 0;
 }
 
@@ -760,34 +762,34 @@ int libxl_device_nic_add(struct libxl_ct
     device.domid = nic->domid;
     device.kind = DEVICE_VIF;
 
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "frontend-id"));
+    flexarray_set(back, boffset++, "frontend-id");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", nic->domid));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "online"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "1"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "script"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", nic->script));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "mac"));
+    flexarray_set(back, boffset++, "script");
+    flexarray_set(back, boffset++, nic->script);
+    flexarray_set(back, boffset++, "mac");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, 
"%02x:%02x:%02x:%02x:%02x:%02x",
                                                  nic->mac[0], nic->mac[1], 
nic->mac[2],
                                                  nic->mac[3], nic->mac[4], 
nic->mac[5]));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "handle"));
+    flexarray_set(back, boffset++, "handle");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", nic->devid));
 
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+    flexarray_set(front, foffset++, "backend-id");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
nic->backend_domid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(front, foffset++, "state");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "handle"));
+    flexarray_set(front, foffset++, "handle");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", nic->devid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "mac"));
+    flexarray_set(front, foffset++, "mac");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, 
"%02x:%02x:%02x:%02x:%02x:%02x",
                                                   nic->mac[0], nic->mac[1], 
nic->mac[2],
                                                   nic->mac[3], nic->mac[4], 
nic->mac[5]));
     if (0 /* protocol != native*/) {
-        flexarray_set(front, foffset++, libxl_sprintf(ctx, "protocol"));
-        flexarray_set(front, foffset++, libxl_sprintf(ctx, "x86_32-abi")); /* 
hardcoded ! */
+        flexarray_set(front, foffset++, "protocol");
+        flexarray_set(front, foffset++, "x86_32-abi"); /* hardcoded ! */
     }
 
     libxl_device_generic_add(ctx, &device,
@@ -795,6 +797,8 @@ int libxl_device_nic_add(struct libxl_ct
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
 
     /* FIXME: wait for plug */
+    flexarray_free(back);
+    flexarray_free(front);
     return 0;
 }
 
@@ -820,20 +824,20 @@ int libxl_device_console_add(struct libx
     if (console->build_state) {
         xs_transaction_t t;
         char **ents = (char **) libxl_calloc(ctx, 9, sizeof(char *));
-        ents[0] = libxl_sprintf(ctx, "console/port");
+        ents[0] = "console/port";
         ents[1] = libxl_sprintf(ctx, "%"PRIu32, 
console->build_state->console_port);
-        ents[2] = libxl_sprintf(ctx, "console/ring-ref");
+        ents[2] = "console/ring-ref";
         ents[3] = libxl_sprintf(ctx, "%lu", console->build_state->console_mfn);
-        ents[4] = libxl_sprintf(ctx, "console/limit");
+        ents[4] = "console/limit";
         ents[5] = libxl_sprintf(ctx, "%d", LIBXL_XENCONSOLE_LIMIT);
-        ents[6] = libxl_sprintf(ctx, "console/type");
+        ents[6] = "console/type";
         if (console->constype == CONSTYPE_XENCONSOLED)
             ents[7] = "xenconsoled";
         else
             ents[7] = "ioemu";
 retry_transaction:
         t = xs_transaction_start(ctx->xsh);
-        libxl_xs_writev(ctx, t, xs_get_domain_path(ctx->xsh, console->domid), 
ents);
+        libxl_xs_writev(ctx, t, libxl_xs_get_dompath(ctx, console->domid), 
ents);
         if (!xs_transaction_end(ctx->xsh, t, 0))
             if (errno == EAGAIN)
                 goto retry_transaction;
@@ -853,35 +857,36 @@ retry_transaction:
     device.domid = console->domid;
     device.kind = DEVICE_CONSOLE;
 
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "frontend-id"));
+    flexarray_set(back, boffset++, "frontend-id");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", console->domid));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "online"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "1"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "domain"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", 
libxl_domid_to_name(ctx, domid)));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "protocol"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, 
LIBXL_XENCONSOLE_PROTOCOL));
-
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+    flexarray_set(back, boffset++, "domain");
+    flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid));
+    flexarray_set(back, boffset++, "protocol");
+    flexarray_set(back, boffset++, LIBXL_XENCONSOLE_PROTOCOL);
+
+    flexarray_set(front, foffset++, "backend-id");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
console->backend_domid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(front, foffset++, "state");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "limit"));
+    flexarray_set(front, foffset++, "limit");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
LIBXL_XENCONSOLE_LIMIT));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "protocol"));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, 
LIBXL_XENCONSOLE_PROTOCOL));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "type"));
+    flexarray_set(front, foffset++, "protocol");
+    flexarray_set(front, foffset++, LIBXL_XENCONSOLE_PROTOCOL);
+    flexarray_set(front, foffset++, "type");
     if (console->constype == CONSTYPE_XENCONSOLED)
-        flexarray_set(front, foffset++, libxl_sprintf(ctx, "xenconsoled"));
+        flexarray_set(front, foffset++, "xenconsoled");
     else
-        flexarray_set(front, foffset++, libxl_sprintf(ctx, "ioemu"));
+        flexarray_set(front, foffset++, "ioemu");
 
     libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
-
+    flexarray_free(back);
+    flexarray_free(front);
 
     return 0;
 }
@@ -909,23 +914,25 @@ int libxl_device_vkb_add(struct libxl_ct
     device.domid = vkb->domid;
     device.kind = DEVICE_VKBD;
 
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "frontend-id"));
+    flexarray_set(back, boffset++, "frontend-id");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vkb->domid));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "online"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "1"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "domain"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", 
libxl_domid_to_name(ctx, domid)));
-
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+    flexarray_set(back, boffset++, "domain");
+    flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid));
+
+    flexarray_set(front, foffset++, "backend-id");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
vkb->backend_domid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(front, foffset++, "state");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 1));
 
     libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
+    flexarray_free(back);
+    flexarray_free(front);
 
     return 0;
 }
@@ -1014,38 +1021,38 @@ int libxl_device_vfb_add(struct libxl_ct
     device.domid = vfb->domid;
     device.kind = DEVICE_VFB;
 
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "frontend-id"));
+    flexarray_set(back, boffset++, "frontend-id");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->domid));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "online"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "1"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "domain"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", 
libxl_domid_to_name(ctx, domid)));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "vnc"));
+    flexarray_set(back, boffset++, "domain");
+    flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid));
+    flexarray_set(back, boffset++, "vnc");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->vnc));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "vnclisten"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", vfb->vnclisten));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "vncdisplay"));
+    flexarray_set(back, boffset++, "vnclisten");
+    flexarray_set(back, boffset++, vfb->vnclisten);
+    flexarray_set(back, boffset++, "vncdisplay");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->vncdisplay));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "vncunused"));
+    flexarray_set(back, boffset++, "vncunused");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->vncunused));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "sdl"));
+    flexarray_set(back, boffset++, "sdl");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->sdl));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "opengl"));
+    flexarray_set(back, boffset++, "opengl");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->opengl));
     if (vfb->xauthority) {
-        flexarray_set(back, boffset++, libxl_sprintf(ctx, "xauthority"));
-        flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", 
vfb->xauthority));
+        flexarray_set(back, boffset++, "xauthority");
+        flexarray_set(back, boffset++, vfb->xauthority);
     }
     if (vfb->display) {
-        flexarray_set(back, boffset++, libxl_sprintf(ctx, "display"));
-        flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", vfb->display));
-    }
-
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+        flexarray_set(back, boffset++, "display");
+        flexarray_set(back, boffset++, vfb->display);
+    }
+
+    flexarray_set(front, foffset++, "backend-id");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
vfb->backend_domid));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(front, foffset++, "state");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 1));
 
     libxl_device_generic_add(ctx, &device,
@@ -1107,14 +1114,14 @@ static int libxl_create_pci_backend(stru
     device.domid = domid;
     device.kind = DEVICE_PCI;
 
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "frontend-id"));
+    flexarray_set(back, boffset++, "frontend-id");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", domid));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "online"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "1"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "domain"));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s", 
libxl_domid_to_name(ctx, domid)));
+    flexarray_set(back, boffset++, "domain");
+    flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid));
     for (i = 0; i < num; i++) {
         flexarray_set(back, boffset++, libxl_sprintf(ctx, "key-%d", i));
         flexarray_set(back, boffset++, libxl_sprintf(ctx, PCI_BDF, 
pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func));
@@ -1129,12 +1136,12 @@ static int libxl_create_pci_backend(stru
         flexarray_set(back, boffset++, libxl_sprintf(ctx, "state-%d", i));
         flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
     }
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "num_devs"));
+    flexarray_set(back, boffset++, "num_devs");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", num));
 
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+    flexarray_set(front, foffset++, "backend-id");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 0));
-    flexarray_set(front, foffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(front, foffset++, "state");
     flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 1));
 
     libxl_device_generic_add(ctx, &device,
@@ -1154,7 +1161,7 @@ static int libxl_device_pci_add_xenstore
     unsigned int boffset = 0;
     xs_transaction_t t;
 
-    be_path = libxl_sprintf(ctx, "%s/backend/pci/%d/0", 
xs_get_domain_path(ctx->xsh, 0), domid);
+    be_path = libxl_sprintf(ctx, "%s/backend/pci/%d/0", 
libxl_xs_get_dompath(ctx, 0), domid);
     num_devs = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/num_devs", 
be_path));
     if (!num_devs)
         return libxl_create_pci_backend(ctx, domid, pcidev, 1);
@@ -1182,9 +1189,9 @@ static int libxl_device_pci_add_xenstore
     flexarray_set(back, boffset++, libxl_sprintf(ctx, 
"msitranslate=%d,power_mgmt=%d", pcidev->msitranslate, pcidev->power_mgmt));
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "state-%d", num));
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "num_devs"));
+    flexarray_set(back, boffset++, "num_devs");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", num + 1));
-    flexarray_set(back, boffset++, libxl_sprintf(ctx, "state"));
+    flexarray_set(back, boffset++, "state");
     flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 7));
 
 retry_transaction:
@@ -1206,7 +1213,7 @@ static int libxl_device_pci_remove_xenst
     xs_transaction_t t;
     unsigned int domain = 0, bus = 0, dev = 0, func = 0;
 
-    be_path = libxl_sprintf(ctx, "%s/backend/pci/%d/0", 
xs_get_domain_path(ctx->xsh, 0), domid);
+    be_path = libxl_sprintf(ctx, "%s/backend/pci/%d/0", 
libxl_xs_get_dompath(ctx, 0), domid);
     num_devs_path = libxl_sprintf(ctx, "%s/num_devs", be_path);
     num_devs = libxl_xs_read(ctx, XBT_NULL, num_devs_path);
     if (!num_devs)
@@ -1432,14 +1439,14 @@ libxl_device_pci *libxl_device_pci_list(
     unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0;
     libxl_device_pci *pcidevs;
 
-    be_path = libxl_sprintf(ctx, "%s/backend/pci/%d/0", 
xs_get_domain_path(ctx->xsh, 0), domid);
+    be_path = libxl_sprintf(ctx, "%s/backend/pci/%d/0", 
libxl_xs_get_dompath(ctx, 0), domid);
     num_devs = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/num_devs", 
be_path));
     if (!num_devs) {
         *num = 0;
         return NULL;
     }
     n = atoi(num_devs);
-    pcidevs = (libxl_device_pci *) libxl_calloc(ctx, n, 
sizeof(libxl_device_pci));
+    pcidevs = (libxl_device_pci *) calloc(n, sizeof(libxl_device_pci));
     *num = n;
 
     for (i = 0; i < n; i++) {
@@ -1479,6 +1486,7 @@ int libxl_device_pci_shutdown(struct lib
         if (libxl_device_pci_remove(ctx, domid, pcidevs + i) < 0)
             return -1;
     }
-    return 0;
-}
-
+    free(pcidevs);
+    return 0;
+}
+
diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/libxl.h       Mon Nov 23 07:04:54 2009 +0000
@@ -85,7 +85,12 @@ typedef struct {
     } u;
 } libxl_domain_build_info;
 
-typedef struct libxl_domain_build_state_ libxl_domain_build_state;
+typedef struct {
+    uint32_t store_port;
+    unsigned long store_mfn;
+    uint32_t console_port;
+    unsigned long console_mfn;
+} libxl_domain_build_state;
 
 typedef struct {
     int flags;
@@ -226,7 +231,7 @@ int libxl_ctx_set_log(struct libxl_ctx *
 
 /* domain related functions */
 int libxl_domain_make(struct libxl_ctx *ctx, libxl_domain_create_info *info, 
uint32_t *domid);
-libxl_domain_build_state *libxl_domain_build(struct libxl_ctx *ctx, 
libxl_domain_build_info *info, uint32_t domid);
+int libxl_domain_build(struct libxl_ctx *ctx, libxl_domain_build_info *info, 
uint32_t domid, /* out */ libxl_domain_build_state *state);
 int libxl_domain_restore(struct libxl_ctx *ctx, libxl_domain_build_info *info,
                           uint32_t domid, int fd);
 int libxl_domain_suspend(struct libxl_ctx *ctx, libxl_domain_suspend_info 
*info,
diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/libxl_device.c        Mon Nov 23 07:04:54 2009 +0000
@@ -45,8 +45,8 @@ int libxl_device_generic_add(struct libx
     struct xs_permissions backend_perms[2];
     struct xs_permissions hotplug_perms[1];
 
-    dom_path_backend = xs_get_domain_path(ctx->xsh, device->backend_domid);
-    dom_path = xs_get_domain_path(ctx->xsh, device->domid);
+    dom_path_backend = libxl_xs_get_dompath(ctx, device->backend_domid);
+    dom_path = libxl_xs_get_dompath(ctx, device->domid);
 
     frontend_path = libxl_sprintf(ctx, "%s/device/%s/%d",
                                   dom_path, string_of_kinds[device->kind], 
device->devid);
@@ -254,6 +254,7 @@ int libxl_devices_destroy(struct libxl_c
                         XL_LOG(ctx, XL_LOG_DEBUG, "Destroyed device backend at 
%s", l1[1]);
                         n_watches--;
                     }
+                    free(l1);
                 }
             } else
                 break;
diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c   Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/libxl_dom.c   Mon Nov 23 07:04:54 2009 +0000
@@ -75,15 +75,15 @@ int build_post(struct libxl_ctx *ctx, ui
     char **ents;
 
     ents = libxl_calloc(ctx, 10 * 2, sizeof(char *));
-    ents[0] = libxl_sprintf(ctx, "memory/static-max");
+    ents[0] = "memory/static-max";
     ents[1] = libxl_sprintf(ctx, "%d", info->max_memkb);
-    ents[2] = libxl_sprintf(ctx, "memory/target");
+    ents[2] = "memory/target";
     ents[3] = libxl_sprintf(ctx, "%d", info->max_memkb); /* PROBABLY WRONG */
-    ents[4] = libxl_sprintf(ctx, "domid");
+    ents[4] = "domid";
     ents[5] = libxl_sprintf(ctx, "%d", domid);
-    ents[6] = libxl_sprintf(ctx, "store/port");
+    ents[6] = "store/port";
     ents[7] = libxl_sprintf(ctx, "%"PRIu32, state->store_port);
-    ents[8] = libxl_sprintf(ctx, "store/ring-ref");
+    ents[8] = "store/ring-ref";
     ents[9] = libxl_sprintf(ctx, "%lu", state->store_mfn);
 
     dom_path = libxl_xs_get_dompath(ctx, domid);
@@ -102,6 +102,7 @@ retry_transaction:
         if (errno == EAGAIN)
             goto retry_transaction;
     xs_introduce_domain(ctx->xsh, domid, state->store_mfn, state->store_port);
+    free(vm_path);
     return 0;
 }
 
diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/libxl_internal.h      Mon Nov 23 07:04:54 2009 +0000
@@ -53,13 +53,6 @@
 
 void xl_logv(struct libxl_ctx *ctx, int errnoval, int loglevel, const char 
*file, int line, const char *func, char *fmt, va_list al);
 void xl_log(struct libxl_ctx *ctx, int errnoval, int loglevel, const char 
*file, int line, const char *func, char *fmt, ...);
-
-struct libxl_domain_build_state_ {
-    uint32_t store_port;
-    unsigned long store_mfn;
-    uint32_t console_port;
-    unsigned long console_mfn;
-};
 
 typedef enum {
     DEVICE_VIF,
diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/libxl_utils.c Mon Nov 23 07:04:54 2009 +0000
@@ -70,6 +70,7 @@ int libxl_name_to_domid(struct libxl_ctx
             for (j = 0; j < nb_domains; j++) {
                 if (dominfo[j].domid == domid_i) {
                     *domid = domid_i;
+                    free(dominfo);
                     free(l);
                     free(domname);
                     return 0;
@@ -78,6 +79,7 @@ int libxl_name_to_domid(struct libxl_ctx
         }
         free(domname);
     }
+    free(dominfo);
     free(l);
     return -1;
 }
@@ -89,9 +91,11 @@ int libxl_uuid_to_domid(struct libxl_ctx
     for (i = 0; i < nb_domain; i++) {
         if (!memcmp(info[i].uuid, uuid, 16)) {
             *domid = info[i].domid;
+            free(info);
             return 0;
         }
     }
+    free(info);
     return -1;
 }
 
@@ -103,9 +107,11 @@ int libxl_domid_to_uuid(struct libxl_ctx
         if (domid == info[i].domid) {
             *uuid = libxl_zalloc(ctx, 16);
             memcpy(*uuid, info[i].uuid, 16);
+            free(info);
             return 0;
         }
     }
+    free(info);
     return -1;
 }
 
diff -r 9a78b0812158 -r a986c3c5b163 tools/libxl/xl.c
--- a/tools/libxl/xl.c  Mon Nov 23 07:03:01 2009 +0000
+++ b/tools/libxl/xl.c  Mon Nov 23 07:04:54 2009 +0000
@@ -714,7 +714,7 @@ static void create_domain(int debug, con
     uint32_t domid;
     libxl_domain_create_info info1;
     libxl_domain_build_info info2;
-    libxl_domain_build_state *state;
+    libxl_domain_build_state state;
     libxl_device_model_info dm_info;
     libxl_device_disk *disks = NULL;
     libxl_device_nic *vifs = NULL;
@@ -734,7 +734,7 @@ static void create_domain(int debug, con
     libxl_ctx_init(&ctx);
     libxl_ctx_set_log(&ctx, log_callback, NULL);
     libxl_domain_make(&ctx, &info1, &domid);
-    state = libxl_domain_build(&ctx, &info2, domid);
+    libxl_domain_build(&ctx, &info2, domid, &state);
 
     for (i = 0; i < num_disks; i++) {
         disk_info_domid_fixup(disks + i, domid);
@@ -755,7 +755,7 @@ static void create_domain(int debug, con
             vkb_info_domid_fixup(vkbs + i, domid);
             libxl_device_vkb_add(&ctx, domid, &vkbs[i]);
         }
-        init_console_info(&console, 0, state);
+        init_console_info(&console, 0, &state);
         console_info_domid_fixup(&console, domid);
         if (num_vfbs)
             console.constype = CONSTYPE_IOEMU;
@@ -771,6 +771,15 @@ static void create_domain(int debug, con
 
     libxl_domain_unpause(&ctx, domid);
 
+    for (i = 0; i < num_vifs; i++) {
+        free(vifs[i].smac);
+        free(vifs[i].ifname);
+    }
+    free(disks);
+    free(vifs);
+    free(vfbs);
+    free(vkbs);
+    free(pcidevs);
 }
 
 static void help(char *command)
@@ -829,6 +838,7 @@ void pcilist(char *dom)
     for (i = 0; i < num; i++) {
         printf("0x%02x 0x%04x 0x%02x 0x%02x 0x%01x\n", pcidevs[i].vdevfn, 
pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
     }
+    free(pcidevs);
 }
 
 int main_pcilist(int argc, char **argv)
@@ -999,6 +1009,7 @@ void list_domains(void)
                 info[i].dying ? 'd' : '-',
                 ((float)info[i].cpu_time / 1e9));
     }
+    free(info);
 }
 
 int main_destroy(int argc, char **argv)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] libxenlight: fix memory leaks, Xen patchbot-unstable <=