Hi all,
this patch fixes many memory leaks currently present in libxenlight.
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>
---
diff -r acc9be7fffbd tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/libxl.c Thu Nov 19 15:32:23 2009 +0000
@@ -180,33 +180,32 @@
return 0;
}
-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, libxl_domain_build_state *state)
{
- libxl_domain_build_state *state = (libxl_domain_build_state *)
libxl_calloc(ctx, 1, sizeof(libxl_domain_build_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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
} 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 @@
}
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 @@
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 @@
rc = 0;
xit:
+ free(args);
close(null);
close(logfile_w);
@@ -671,17 +672,17 @@
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 @@
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(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++, libxl_sprintf(ctx, "backend-id"));
+ 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 @@
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 @@
libxl_xs_kvs_of_flexarray(ctx, front, foffset));
/* FIXME: wait for plug */
+ flexarray_free(back);
+ flexarray_free(front);
return 0;
}
@@ -820,20 +824,20 @@
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 @@
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(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++, libxl_sprintf(ctx, "backend-id"));
+ 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 @@
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(back, boffset++, "domain");
+ flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid));
- flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+ 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 @@
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(back, boffset++, "display");
+ flexarray_set(back, boffset++, vfb->display);
}
- flexarray_set(front, foffset++, libxl_sprintf(ctx, "backend-id"));
+ 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
if (libxl_device_pci_remove(ctx, domid, pcidevs + i) < 0)
return -1;
}
+ free(pcidevs);
return 0;
}
diff -r acc9be7fffbd tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/libxl.h Thu Nov 19 15:32:23 2009 +0000
@@ -85,7 +85,12 @@
} 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 @@
/* 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 acc9be7fffbd tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/libxl_device.c Thu Nov 19 15:32:23 2009 +0000
@@ -45,8 +45,8 @@
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 @@
XL_LOG(ctx, XL_LOG_DEBUG, "Destroyed device backend at
%s", l1[1]);
n_watches--;
}
+ free(l1);
}
} else
break;
diff -r acc9be7fffbd tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/libxl_dom.c Thu Nov 19 15:32:23 2009 +0000
@@ -75,15 +75,15 @@
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 @@
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 acc9be7fffbd tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/libxl_internal.h Thu Nov 19 15:32:23 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 acc9be7fffbd tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/libxl_utils.c Thu Nov 19 15:32:23 2009 +0000
@@ -70,6 +70,7 @@
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 @@
}
free(domname);
}
+ free(dominfo);
free(l);
return -1;
}
@@ -89,9 +91,11 @@
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 @@
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 acc9be7fffbd tools/libxl/xl.c
--- a/tools/libxl/xl.c Thu Nov 19 15:14:15 2009 +0000
+++ b/tools/libxl/xl.c Thu Nov 19 15:32:23 2009 +0000
@@ -714,7 +714,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
info[i].dying ? 'd' : '-',
((float)info[i].cpu_time / 1e9));
}
+ free(info);
}
int main_destroy(int argc, char **argv)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|