diff options
author | "Gianni Tedesco (3P)" <gianni.tedesco@citrix.com> | 2010-08-11 13:08:14 +0100 |
---|---|---|
committer | "Gianni Tedesco (3P)" <gianni.tedesco@citrix.com> | 2010-08-11 13:08:14 +0100 |
commit | aa417c220cc8b78b57db45ad6753b1f9998c6e54 (patch) | |
tree | 54209ba593a4d32f9039cc2a0d8ac2dcd00a48f4 | |
parent | 0cd00834b5db08ff76668815b55100ff850d44bc (diff) | |
download | xen-aa417c220cc8b78b57db45ad6753b1f9998c6e54.tar.gz xen-aa417c220cc8b78b57db45ad6753b1f9998c6e54.tar.bz2 xen-aa417c220cc8b78b57db45ad6753b1f9998c6e54.zip |
xl: Fix invalid return of libxl-internal pointers via libxl_domid_to_name()
libxl_domid_to_name has numerous in-and-out-of-library callers. In
library callers now use _libxl_domid_to_name() which participates in
garbage collection and out-of-library callers are fixed up to free() the
domain name.
Signed-off-by: Gianni Tedesco <gianni.tedesco@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
-rw-r--r-- | tools/libxl/libxl.c | 12 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.h | 3 | ||||
-rw-r--r-- | tools/libxl/libxl_pci.c | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.c | 11 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 49 |
5 files changed, 50 insertions, 27 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 6d9869be70..3f08f85394 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1379,7 +1379,7 @@ static int libxl_create_stubdom(libxl_ctx *ctx, memset(&c_info, 0x00, sizeof(libxl_domain_create_info)); c_info.hvm = 0; - c_info.name = libxl_sprintf(ctx, "%s-dm", libxl_domid_to_name(ctx, info->domid)); + c_info.name = libxl_sprintf(ctx, "%s-dm", _libxl_domid_to_name(ctx, info->domid)); for (i = 0; i < 16; i++) c_info.uuid[i] = info->uuid[i]; @@ -2186,7 +2186,7 @@ retry_transaction: flexarray_set(back, boffset++, "state"); flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1)); flexarray_set(back, boffset++, "domain"); - flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid)); + flexarray_set(back, boffset++, _libxl_domid_to_name(ctx, domid)); flexarray_set(back, boffset++, "protocol"); flexarray_set(back, boffset++, LIBXL_XENCONSOLE_PROTOCOL); @@ -2243,7 +2243,7 @@ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb) flexarray_set(back, boffset++, "state"); flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1)); flexarray_set(back, boffset++, "domain"); - flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid)); + 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)); @@ -2420,7 +2420,7 @@ static int libxl_build_xenpv_qemu_args(libxl_ctx *ctx, uint32_t guest_domid; if (libxl_is_stubdom(ctx, vfb->domid, &guest_domid)) { char *filename; - char *name = libxl_sprintf(ctx, "qemu-dm-%s", libxl_domid_to_name(ctx, guest_domid)); + char *name = libxl_sprintf(ctx, "qemu-dm-%s", _libxl_domid_to_name(ctx, guest_domid)); libxl_create_logfile(ctx, name, &filename); info->serial = libxl_sprintf(ctx, "file:%s", filename); free(filename); @@ -2438,7 +2438,7 @@ static int libxl_build_xenpv_qemu_args(libxl_ctx *ctx, info->extra[j] = NULL; } info->domid = vfb->domid; - info->dom_name = libxl_domid_to_name(ctx, vfb->domid); + info->dom_name = _libxl_domid_to_name(ctx, vfb->domid); info->device_model = libxl_abs_path(ctx, "qemu-dm", libxl_libexec_path()); info->type = XENPV; return 0; @@ -2484,7 +2484,7 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb) flexarray_set(back, boffset++, "state"); flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1)); flexarray_set(back, boffset++, "domain"); - flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid)); + 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++, "vnclisten"); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 401f812ff7..2b2d9635bc 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -227,8 +227,7 @@ char *libxl_abs_path(libxl_ctx *ctx, char *s, const char *path); #define XL_LOG_WARNING XTL_WARN #define XL_LOG_ERROR XTL_ERROR -/* Error handling */ -int libxl_xc_error(int xc_err); +char *_libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid); #endif diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 41dba62572..9fc605a261 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -228,7 +228,7 @@ static int libxl_create_pci_backend(libxl_ctx *ctx, uint32_t domid, libxl_device flexarray_set(back, boffset++, "state"); flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 1)); flexarray_set(back, boffset++, "domain"); - flexarray_set(back, boffset++, libxl_domid_to_name(ctx, domid)); + 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)); diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 1042cc848c..7fe10396fc 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -51,7 +51,14 @@ char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid) snprintf(path, sizeof(path), "/local/domain/%d/name", domid); s = xs_read(ctx->xsh, XBT_NULL, path, &len); - libxl_ptr_add(ctx, s); + return s; +} + +char *_libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid) +{ + char *s = libxl_domid_to_name(ctx, domid); + if ( s ) + libxl_ptr_add(ctx, s); return s; } @@ -68,7 +75,7 @@ int libxl_name_to_domid(libxl_ctx *ctx, const char *name, return ERROR_NOMEM; for (i = 0; i < nb_domains; i++) { - domname = libxl_domid_to_name(ctx, dominfo[i].domid); + domname = _libxl_domid_to_name(ctx, dominfo[i].domid); if (!domname) continue; if (strcmp(domname, name) == 0) { diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index ab794d547b..c99c495dfe 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -2154,8 +2154,10 @@ void list_domains(int verbose, const libxl_dominfo *info, int nb_domain) printf("Name ID Mem VCPUs\tState\tTime(s)\n"); for (i = 0; i < nb_domain; i++) { + char *domname; + domname = libxl_domid_to_name(&ctx, info[i].domid); printf("%-40s %5d %5lu %5d %c%c%c%c%c%c %8.1f", - libxl_domid_to_name(&ctx, info[i].domid), + domname, info[i].domid, (unsigned long) (info[i].max_memkb / 1024), info[i].vcpu_online, @@ -2166,6 +2168,7 @@ void list_domains(int verbose, const libxl_dominfo *info, int nb_domain) info[i].shutdown_reason == SHUTDOWN_crash ? 'c' : '-', info[i].dying ? 'd' : '-', ((float)info[i].cpu_time / 1e9)); + free(domname); if (verbose) { char *uuid = libxl_uuid2string(&ctx, info[i].uuid); printf(" %s", uuid); @@ -2177,6 +2180,7 @@ void list_domains(int verbose, const libxl_dominfo *info, int nb_domain) void list_vm(void) { libxl_vminfo *info; + char *domname; int nb_vm, i; info = libxl_list_vm(&ctx, &nb_vm); @@ -2187,12 +2191,14 @@ void list_vm(void) } printf("UUID ID name\n"); for (i = 0; i < nb_vm; i++) { + domname = libxl_domid_to_name(&ctx, info[i].domid); printf(UUID_FMT " %d %-30s\n", info[i].uuid[0], info[i].uuid[1], info[i].uuid[2], info[i].uuid[3], info[i].uuid[4], info[i].uuid[5], info[i].uuid[6], info[i].uuid[7], info[i].uuid[8], info[i].uuid[9], info[i].uuid[10], info[i].uuid[11], info[i].uuid[12], info[i].uuid[13], info[i].uuid[14], info[i].uuid[15], - info[i].domid, libxl_domid_to_name(&ctx, info[i].domid)); + info[i].domid, domname); + free(domname); } free(info); } @@ -3197,10 +3203,13 @@ static void print_vcpuinfo(uint32_t tdomid, int i, l; uint64_t *cpumap; uint64_t pcpumap; + char *domname; /* NAME ID VCPU */ + domname = libxl_domid_to_name(&ctx, tdomid); printf("%-32s %5u %5u", - libxl_domid_to_name(&ctx, tdomid), tdomid, vcpuinfo->vcpuid); + domname, tdomid, vcpuinfo->vcpuid); + free(domname); if (!vcpuinfo->online) { /* CPU STA */ printf("%5c %3c%cp ", '-', '-', '-'); @@ -3608,11 +3617,14 @@ static int sched_credit_domain_set( static void sched_credit_domain_output( int domid, libxl_sched_credit *scinfo) { + char *domname; + domname = libxl_domid_to_name(&ctx, domid); printf("%-33s %4d %6d %4d\n", - libxl_domid_to_name(&ctx, domid), + domname, domid, scinfo->weight, scinfo->cap); + free(domname); } int main_sched_credit(int argc, char **argv) @@ -3758,6 +3770,7 @@ int main_domname(int argc, char **argv) } printf("%s\n", domname); + free(domname); return 0; } @@ -4519,6 +4532,7 @@ static void print_dom0_uptime(int short_mode, time_t now) uint32_t uptime = 0; char *uptime_str = NULL; char *now_str = NULL; + char *domname; fd = open("/proc/uptime", O_RDONLY); if (fd == -1) @@ -4533,24 +4547,25 @@ static void print_dom0_uptime(int short_mode, time_t now) strtok(buf, " "); uptime = strtoul(buf, NULL, 10); + domname = libxl_domid_to_name(&ctx, 0); if (short_mode) { now_str = current_time_to_string(now); uptime_str = uptime_to_string(uptime, 1); printf(" %s up %s, %s (%d)\n", now_str, uptime_str, - libxl_domid_to_name(&ctx, 0), 0); + domname, 0); } else { + now_str = NULL; uptime_str = uptime_to_string(uptime, 0); - printf("%-33s %4d %s\n", libxl_domid_to_name(&ctx, 0), + printf("%-33s %4d %s\n", domname, 0, uptime_str); } - if (now_str) - free(now_str); - if (uptime_str) - free(uptime_str); + free(now_str); + free(uptime_str); + free(domname); return; err: fprintf(stderr, "Can not get Dom0 uptime.\n"); @@ -4563,29 +4578,31 @@ static void print_domU_uptime(uint32_t domuid, int short_mode, time_t now) uint32_t uptime = 0; char *uptime_str = NULL; char *now_str = NULL; + char *domname; s_time = libxl_vm_get_start_time(&ctx, domuid); if (s_time == -1) return; uptime = now - s_time; + domname = libxl_domid_to_name(&ctx, domuid); if (short_mode) { now_str = current_time_to_string(now); uptime_str = uptime_to_string(uptime, 1); printf(" %s up %s, %s (%d)\n", now_str, uptime_str, - libxl_domid_to_name(&ctx, domuid), domuid); + domname, domuid); } else { + now_str = NULL; uptime_str = uptime_to_string(uptime, 0); - printf("%-33s %4d %s\n", libxl_domid_to_name(&ctx, domuid), + printf("%-33s %4d %s\n", domname, domuid, uptime_str); } - if (now_str) - free(now_str); - if (uptime_str) - free(uptime_str); + free(domname); + free(now_str); + free(uptime_str); return; } |