[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 06 of 27 v3] libxl: various fixes to libxl_device_disk_list (and internals)
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1318930555 -3600 # Node ID 83cc6057edeceb873c7ecd694bd2766da367ffea # Parent 520855af77ed20f228d6747c1fb2a4ed8de831fd libxl: various fixes to libxl_device_disk_list (and internals) - handle realloc errors - remove redundancy of libxl__append_disk_list_of_type return value and ndisks paramter. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r 520855af77ed -r 83cc6057edec tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 @@ -1505,11 +1505,11 @@ int libxl_device_vkb_hard_shutdown(libxl return ERROR_NI; } -static unsigned int libxl__append_disk_list_of_type(libxl__gc *gc, - uint32_t domid, - const char *type, - libxl_device_disk **disks, - unsigned int *ndisks) +static int libxl__append_disk_list_of_type(libxl__gc *gc, + uint32_t domid, + const char *type, + libxl_device_disk **disks, + int *ndisks) { libxl_ctx *ctx = libxl__gc_owner(gc); char *be_path = NULL; @@ -1523,11 +1523,16 @@ static unsigned int libxl__append_disk_l dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); if (dir) { char *removable; - *disks = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); + libxl_device_disk *tmp; + tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); + if (tmp == NULL) + return ERROR_NOMEM; + *disks = tmp; pdisk = *disks + *ndisks; *ndisks += n; pdisk_end = *disks + *ndisks; for (; pdisk < pdisk_end; pdisk++, dir++) { + memset(pdisk, 0, sizeof(*pdisk)); pdisk->backend_domid = 0; physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len); if (physpath_tmp && strchr(physpath_tmp, ':')) { @@ -1555,22 +1560,37 @@ static unsigned int libxl__append_disk_l pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN; } } - - return n; + return 0; } libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num) { libxl__gc gc = LIBXL_INIT_GC(ctx); libxl_device_disk *disks = NULL; - unsigned int ndisks = 0; - - *num = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, &ndisks); - *num += libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, &ndisks); - *num += libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, &ndisks); + int rc; + + *num = 0; + + rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num); + if (rc) goto out_err; + + rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num); + if (rc) goto out_err; + + rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num); + if (rc) goto out_err; libxl__free_all(&gc); return disks; + +out_err: + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks"); + while (disks && *num) { + (*num)--; + libxl_device_disk_dispose(&disks[*num]); + } + free(disks); + return NULL; } int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |