From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH for-4.6 v2 1/8] libxl: properly clean up array in libxl_list_cpupool failure path Date: Mon, 27 Jul 2015 18:45:02 +0100 Message-ID: <1438019109-31997-2-git-send-email-wei.liu2@citrix.com> References: <1438019109-31997-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1ZJmSg-0008Cp-Pc for xen-devel@lists.xenproject.org; Mon, 27 Jul 2015 17:45:14 +0000 In-Reply-To: <1438019109-31997-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Xen-devel Cc: Wei Liu , Dario Faggioli , Ian Jackson , Ian Campbell List-Id: xen-devel@lists.xenproject.org Document how cpupool_info works. Distinguish success (ERROR_FAIL + ENOENT) vs failure in libxl_list_cpupool and properly clean up the array in failure path. Also switch to libxl__realloc and call libxl_cpupool_{init,dispose} where appropriate. There is change of behaviour. Previously if memory allocation fails the said function returns NULL. Now memory allocation failure is fatal. This is in line with how we deal with memory allocation failure in other places in libxl though. Signed-off-by: Wei Liu --- Cc: Dario Faggioli --- tools/libxl/libxl.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index ff0d616..c3a13f6 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -682,6 +682,11 @@ int libxl_domain_info(libxl_ctx *ctx, libxl_dominfo *info_r, return 0; } +/* Returns: + * 0 - success + * ERROR_FAIL + errno == ENOENT - no entry found + * ERROR_$FOO + errno != ENOENT - other failure + */ static int cpupool_info(libxl__gc *gc, libxl_cpupoolinfo *info, uint32_t poolid, @@ -737,7 +742,8 @@ int libxl_cpupool_info(libxl_ctx *ctx, libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx *ctx, int *nb_pool_out) { GC_INIT(ctx); - libxl_cpupoolinfo info, *ptr, *tmp; + libxl_cpupoolinfo info, *ptr; + int i; uint32_t poolid; @@ -745,24 +751,29 @@ libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx *ctx, int *nb_pool_out) poolid = 0; for (i = 0;; i++) { - if (cpupool_info(gc, &info, poolid, false)) + libxl_cpupoolinfo_init(&info); + if (cpupool_info(gc, &info, poolid, false)) { + libxl_cpupoolinfo_dispose(&info); + if (errno != ENOENT) goto out; break; - tmp = realloc(ptr, (i + 1) * sizeof(libxl_cpupoolinfo)); - if (!tmp) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpupool info"); - libxl_cpupoolinfo_list_free(ptr, i); - ptr = NULL; - goto out; } - ptr = tmp; + + ptr = libxl__realloc(NOGC, ptr, (i+1) * sizeof(libxl_cpupoolinfo)); ptr[i] = info; poolid = info.poolid + 1; + /* Don't dispose of info because it will be returned to caller */ } *nb_pool_out = i; -out: + GC_FREE; return ptr; + +out: + libxl_cpupoolinfo_list_free(ptr, i); + *nb_pool_out = 0; + GC_FREE; + return NULL; } /* this API call only list VM running on this host. A VM can -- 2.1.4