libxl: fix cd insert/eject When multiple disks are passed to libxl_wait_for_disk_ejects, watch the correct disk paths. Parse the backend type and backend domid from xenstore in libxl_event_get_disk_eject_info. libxl_event_get_disk_eject_info must return a valid string in disk->vdev, while at the moment is free''ed before returning. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> diff -r 20b0f74bc31c tools/libxl/libxl.c --- a/tools/libxl/libxl.c Thu Feb 17 12:25:09 2011 +0000 +++ b/tools/libxl/libxl.c Thu Feb 17 15:31:43 2011 +0000 @@ -592,7 +592,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx goto out; if (asprintf(&(waiter[i].token), "%d", LIBXL_EVENT_DISK_EJECT) < 0) goto out; - xs_watch(ctx->xsh, waiter->path, waiter->token); + xs_watch(ctx->xsh, waiter[i].path, waiter[i].token); } rc = 0; out: @@ -654,6 +654,7 @@ int libxl_event_get_disk_eject_info(libx char *path; char *backend; char *value; + char backend_type[5]; value = libxl__xs_read(&gc, XBT_NULL, event->path); @@ -666,12 +667,20 @@ int libxl_event_get_disk_eject_info(libx path[strlen(path) - 6] = ''\0''; backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path)); - disk->backend_domid = 0; + sscanf(backend, "/local/domain/%d/backend/%5[a-z]/%*d/%*d", &disk->backend_domid, backend_type); + if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) { + disk->backend = DISK_BACKEND_TAP; + } else if (!strcmp(backend_type, "qdisk")) { + disk->backend = DISK_BACKEND_QDISK; + } else { + disk->backend = DISK_BACKEND_UNKNOWN; + } + disk->domid = domid; disk->pdev_path = strdup(""); disk->format = DISK_FORMAT_EMPTY; /* this value is returned to the user: do not free right away */ - disk->vdev = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend)); + disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL); disk->unpluggable = 1; disk->readwrite = 0; disk->is_cdrom = 1; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini writes ("[Xen-devel] [PATCH] libxl: fix cd insert/eject"):> + char backend_type[5];...> + sscanf(backend, "/local/domain/%d/backend/%5[a-z]/%*d/%*d", &disk->backend_domid, backend_type);>From sscanf(3):s Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null character (''\0''), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first. So I think your buffer has an off-by-one error in its size. Also you should not duplicate a magic number like that. Use a #define and preprocessor stringification. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini
2011-Feb-18 11:05 UTC
Re: [Xen-devel] [PATCH] libxl: fix cd insert/eject
On Thu, 17 Feb 2011, Ian Jackson wrote:> Stefano Stabellini writes ("[Xen-devel] [PATCH] libxl: fix cd insert/eject"): > > + char backend_type[5]; > ... > > + sscanf(backend, "/local/domain/%d/backend/%5[a-z]/%*d/%*d", &disk->backend_domid, backend_type); > > >From sscanf(3): > > s Matches a sequence of non-white-space characters; the next > pointer must be a pointer to character array that is long enough > to hold the input sequence and the terminating null character > (''\0''), which is added automatically. The input string stops at > white space or at the maximum field width, whichever occurs > first. > > So I think your buffer has an off-by-one error in its size. > > Also you should not duplicate a magic number like that. Use a #define > and preprocessor stringification. >Ok. Appended an updated version of the patch. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> diff -r 5a4710640f81 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Thu Feb 17 19:52:20 2011 +0000 +++ b/tools/libxl/libxl.c Fri Feb 18 10:19:56 2011 +0000 @@ -37,6 +37,9 @@ #include "flexarray.h" #define PAGE_TO_MEMKB(pages) ((pages) * 4) +#define BACKEND_STRING_SIZE 5 +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) int libxl_ctx_init(libxl_ctx *ctx, int version, xentoollog_logger *lg) { @@ -592,7 +595,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx goto out; if (asprintf(&(waiter[i].token), "%d", LIBXL_EVENT_DISK_EJECT) < 0) goto out; - xs_watch(ctx->xsh, waiter->path, waiter->token); + xs_watch(ctx->xsh, waiter[i].path, waiter[i].token); } rc = 0; out: @@ -654,6 +657,7 @@ int libxl_event_get_disk_eject_info(libx char *path; char *backend; char *value; + char backend_type[BACKEND_STRING_SIZE+1]; value = libxl__xs_read(&gc, XBT_NULL, event->path); @@ -666,12 +670,22 @@ int libxl_event_get_disk_eject_info(libx path[strlen(path) - 6] = ''\0''; backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path)); - disk->backend_domid = 0; + sscanf(backend, + "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d", + &disk->backend_domid, backend_type); + if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) { + disk->backend = DISK_BACKEND_TAP; + } else if (!strcmp(backend_type, "qdisk")) { + disk->backend = DISK_BACKEND_QDISK; + } else { + disk->backend = DISK_BACKEND_UNKNOWN; + } + disk->domid = domid; disk->pdev_path = strdup(""); disk->format = DISK_FORMAT_EMPTY; /* this value is returned to the user: do not free right away */ - disk->vdev = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend)); + disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL); disk->unpluggable = 1; disk->readwrite = 0; disk->is_cdrom = 1; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini writes ("Re: [Xen-devel] [PATCH] libxl: fix cd insert/eject"):> Ok. Appended an updated version of the patch.Applied, thanks. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel