aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2011-10-18 10:35:55 +0100
committerIan Campbell <ian.campbell@citrix.com>2011-10-18 10:35:55 +0100
commitf840d898c7a740e18008c183ab13d270120d57d2 (patch)
tree5018c37bcc249c904b62538a6907cdb4149cf812 /tools
parent134fa16eb6a18b50725a5b4fa84b5284e9acddd4 (diff)
downloadxen-f840d898c7a740e18008c183ab13d270120d57d2.tar.gz
xen-f840d898c7a740e18008c183ab13d270120d57d2.tar.bz2
xen-f840d898c7a740e18008c183ab13d270120d57d2.zip
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@citrix.com> Acked-by: Ian Jackson <ian.jackson.citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/libxl/libxl.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 3e8295b965..cdf00d5413 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1505,11 +1505,11 @@ int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid)
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_list_of_type(libxl__gc *gc,
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_list_of_type(libxl__gc *gc,
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;
+ int rc;
+
+ *num = 0;
+
+ rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+ if (rc) goto out_err;
- *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);
+ 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,