[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.5] tools/libxl: Use of init()/dispose() to avoid leaking libxl_dominfo.ssid_label
commit 54eb18cd63ed7243f1ab497e35807bf6f4a436ec Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Mon Jan 5 14:19:58 2015 +0000 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Tue Jan 6 11:10:43 2015 +0000 tools/libxl: Use of init()/dispose() to avoid leaking libxl_dominfo.ssid_label libxl_dominfo contains a ssid_label pointer which will have memory allocated for it in libxl_domain_info() if the hypervisor has CONFIG_XSM compiled. However, the lack of appropriate use of libxl_dominfo_{init,dispose}() will cause the label string to be leaked, even in success cases. This was discovered by XenServers Coverity scanning, and are issues not identified by upstream Coverity Scan. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxl/libxl.c | 26 ++++++++++++++++++++++++-- tools/libxl/libxl_dom.c | 14 ++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 50a8928..372dd3b 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -364,6 +364,8 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid, char *uuid; const char *vm_name_path; + libxl_dominfo_init(&info); + dom_path = libxl__xs_get_dompath(gc, domid); if (!dom_path) goto x_nomem; @@ -481,6 +483,7 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid, rc = 0; x_rc: if (our_trans) xs_transaction_end(ctx->xsh, our_trans, 1); + libxl_dominfo_dispose(&info); return rc; x_fail: rc = ERROR_FAIL; goto x_rc; @@ -4594,6 +4597,8 @@ static int libxl__fill_dom0_memory_info(libxl__gc *gc, uint32_t *target_memkb, libxl_ctx *ctx = libxl__gc_owner(gc); uint32_t free_mem_slack_kb = 0; + libxl_dominfo_init(&info); + retry_transaction: t = xs_transaction_start(ctx->xsh); @@ -4626,6 +4631,8 @@ retry_transaction: } } + libxl_dominfo_dispose(&info); + libxl_dominfo_init(&info); rc = libxl_domain_info(ctx, &info, 0); if (rc < 0) goto out; @@ -4664,7 +4671,7 @@ out: rc = ERROR_FAIL; } - + libxl_dominfo_dispose(&info); return rc; } @@ -4999,6 +5006,8 @@ int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int wait_secs) uint32_t target_memkb = 0; libxl_dominfo info; + libxl_dominfo_init(&info); + do { wait_secs--; sleep(1); @@ -5007,9 +5016,11 @@ int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int wait_secs) if (rc < 0) goto out; + libxl_dominfo_dispose(&info); + libxl_dominfo_init(&info); rc = libxl_domain_info(ctx, &info, domid); if (rc < 0) - return rc; + goto out; } while (wait_secs > 0 && (info.current_memkb + info.outstanding_memkb) > target_memkb); if ((info.current_memkb + info.outstanding_memkb) <= target_memkb) @@ -5018,6 +5029,7 @@ int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int wait_secs) rc = ERROR_FAIL; out: + libxl_dominfo_dispose(&info); return rc; } @@ -5435,6 +5447,8 @@ static int libxl__set_vcpuonline_xenstore(libxl__gc *gc, uint32_t domid, xs_transaction_t t; int i, rc = ERROR_FAIL; + libxl_dominfo_init(&info); + if (libxl_domain_info(CTX, &info, domid) < 0) { LOGE(ERROR, "getting domain info list"); goto out; @@ -5454,6 +5468,7 @@ retry_transaction: } else rc = 0; out: + libxl_dominfo_dispose(&info); return rc; } @@ -5463,8 +5478,11 @@ static int libxl__set_vcpuonline_qmp(libxl__gc *gc, uint32_t domid, libxl_dominfo info; int i; + libxl_dominfo_init(&info); + if (libxl_domain_info(CTX, &info, domid) < 0) { LOGE(ERROR, "getting domain info list"); + libxl_dominfo_dispose(&info); return ERROR_FAIL; } for (i = 0; i <= info.vcpu_max_id; i++) { @@ -5477,6 +5495,7 @@ static int libxl__set_vcpuonline_qmp(libxl__gc *gc, uint32_t domid, libxl__qmp_cpu_add(gc, domid, i); } } + libxl_dominfo_dispose(&info); return 0; } @@ -6569,12 +6588,15 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, /* Domain UUID */ { libxl_dominfo info; + libxl_dominfo_init(&info); rc = libxl_domain_info(ctx, &info, domid); if (rc) { LOG(ERROR, "fail to get domain info for domain %d", domid); + libxl_dominfo_dispose(&info); goto out; } libxl_uuid_copy(ctx, &d_config->c_info.uuid, &info.uuid); + libxl_dominfo_dispose(&info); } /* Memory limits: diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 94ae818..1d33a18 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -2046,19 +2046,25 @@ const char *libxl__userdata_path(libxl__gc *gc, uint32_t domid, const char *wh) { libxl_ctx *ctx = libxl__gc_owner(gc); - char *uuid_string; + char *uuid_string, *path; libxl_dominfo info; int rc; + libxl_dominfo_init(&info); + rc = libxl_domain_info(ctx, &info, domid); if (rc) { LOGE(ERROR, "unable to find domain info for domain %"PRIu32, domid); - return NULL; + path = NULL; + goto out; } uuid_string = GCSPRINTF(LIBXL_UUID_FMT, LIBXL_UUID_BYTES(info.uuid)); - - return GCSPRINTF("/var/lib/xen/userdata-%s.%u.%s.%s", + path = GCSPRINTF("/var/lib/xen/userdata-%s.%u.%s.%s", wh, domid, uuid_string, userdata_userid); + + out: + libxl_dominfo_dispose(&info); + return path; } static int userdata_delete(libxl__gc *gc, const char *path) -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.5 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |