[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl: Fix bug in libxl_cdrom_insert, make more robust against bad xenstore data
On Wed, 2012-11-21 at 17:29 +0000, George Dunlap wrote: > # HG changeset patch > # User George Dunlap <george.dunlap@xxxxxxxxxxxxx> > # Date 1353518844 0 > # Node ID a4f707f6049a4a8152d2886f1b1d49f9e70ef5eb > # Parent ae6fb202b233af815466055d9f1a635802a50855 > libxl: Fix bug in libxl_cdrom_insert, make more robust against bad xenstore > data > > libxl_cdrom_insert was failing to initialize the backend type, > resulting in the wrong default backend. The result was not only that > the CD was not inserted properly, but also that some improper xenstore > entries were created, causing further block commands to fail. > > This patch fixes the bug by setting the disk backend type based on the > type of the existing device. > > It also makes the system more robust by: > * Checking to see that it has got a valid path before proceeding to > write a partial xenstore entry The above all looked good to me. Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> for those bits. > * Handling non-existent nodes in the backend xenstore entries more > gracefully I wonder if it should error out here rather than assume a default -- the nodes in question should have been written by libxl itself (I think, I don't think these are backend provided keys) so if they are missing something has gone pretty wrong in the library, I think it's worth at least a log message and more than likely an error return. > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> > > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -2201,14 +2201,14 @@ static void libxl__device_disk_from_xs_b > disk->removable = 0; > > tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", > be_path)); > - if (!strcmp(tmp, "w")) > + if (tmp && !strcmp(tmp, "w")) > disk->readwrite = 1; > else > disk->readwrite = 0; > > tmp = libxl__xs_read(gc, XBT_NULL, > libxl__sprintf(gc, "%s/device-type", be_path)); > - disk->is_cdrom = !strcmp(tmp, "cdrom"); > + disk->is_cdrom = tmp && !strcmp(tmp, "cdrom"); > > disk->format = LIBXL_DISK_FORMAT_UNKNOWN; > } > @@ -2353,6 +2353,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u > > libxl__device device; > const char * path; > + char * tmp; > > flexarray_t *insert = NULL; > > @@ -2383,8 +2384,11 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u > disks = libxl_device_disk_list(ctx, domid, &num); > for (i = 0; i < num; i++) { > if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev)) > - /* found */ > + { > + /* Found. Set backend type appropriately. */ > + disk->backend=disks[i].backend; > break; > + } > } > if (i == num) { > LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found"); > @@ -2410,6 +2414,17 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u > > path = libxl__device_backend_path(gc, &device); > > + /* Sanity check: make sure the backend exists before writing here */ > + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", > path)); > + if (!tmp) > + { > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Internal error: %s does not > exist", > + libxl__sprintf(gc, "%s/frontend", path)); > + rc = ERROR_FAIL; > + goto out; > + } > + > + > insert = flexarray_make(gc, 4, 1); > > flexarray_append_pair(insert, "type", > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |