[opensuse-virtual] [PATCH] cdrom-removable.patch in xen-4.0.0 package causes qemu-dm crashes
The cdrom-removable.patch included in the Xen 4.0.0 package for OpenSuSE 11.2 causes qemu-dm to access an unitilaized variable in tools/ioemu-remote/xenstore.c. Below is a corrected version of the troublesome portion of that patch. My fix avoids the segmentation fault, but I have not verified that the intended functionality has been preserved. -- Justin Index: xen-4.0.0-testing/tools/ioemu-remote/xenstore.c =================================================================== --- xen-4.0.0-testing.orig/tools/ioemu-remote/xenstore.c +++ xen-4.0.0-testing/tools/ioemu-remote/xenstore.c @@ -594,6 +594,20 @@ #endif bs = bdrv_new(dev); + /* if cdrom pyhsical put a watch on media-present */ + if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) { + if (drv && !strcmp(drv, "phy")) { + if (pasprintf(&buf, "%s/media-present", bpath) != -1) { + if (bdrv_is_inserted(bs)) + xs_write(xsh, XBT_NULL, buf, "1", strlen("1")); + else { + xs_write(xsh, XBT_NULL, buf, "0", strlen("0")); + } + xs_watch(xsh, buf, "media-present"); + } + } + } + /* check if it is a cdrom */ if (danger_type && !strcmp(danger_type, "cdrom")) { bdrv_set_type_hint(bs, BDRV_TYPE_CDROM); @@ -938,6 +951,50 @@ void xenstore_record_dm_state(const char xenstore_record_dm("state", state); } +void xenstore_process_media_change_event(char **vec) +{ + char *media_present = NULL; + unsigned int len; + + media_present = xs_read(xsh, XBT_NULL, vec[XS_WATCH_PATH], &len); + + if (media_present) { + BlockDriverState *bs; + char *buf = NULL, *cp = NULL, *path = NULL, *dev = NULL; + + path = strdup(vec[XS_WATCH_PATH]); + cp = strstr(path, "media-present"); + if (cp){ + *(cp-1) = '\0'; + pasprintf(&buf, "%s/dev", path); + dev = xs_read(xsh, XBT_NULL, buf, &len); + if (dev) { + if ( !strncmp(dev, "xvd", 3)) { + memmove(dev, dev+1, strlen(dev)); + dev[0] = 'h'; + dev[1] = 'd'; + } + bs = bdrv_find(dev); + if (!bs) { + term_printf("device not found\n"); + return; + } + if (strcmp(media_present, "0") == 0 && bs) { + bdrv_close(bs); + } + else if (strcmp(media_present, "1") == 0 && + bs != NULL && bs->drv == NULL) { + if (bdrv_open(bs, bs->filename, 0 /* snapshot */) < 0) { + fprintf(logfile, "%s() qemu: could not open cdrom disk '%s'\n", + __func__, bs->filename); + } + bs->media_changed = 1; + } + } + } + } +} + void xenstore_process_event(void *opaque) { char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = NULL; @@ -968,6 +1025,11 @@ void xenstore_process_event(void *opaque xenstore_watch_callbacks[i].cb(vec[XS_WATCH_TOKEN], xenstore_watch_callbacks[i].opaque); + if (!strcmp(vec[XS_WATCH_TOKEN], "media-present")) { + xenstore_process_media_change_event(vec); + goto out; + } + if (strncmp(vec[XS_WATCH_TOKEN], "hd", 2) || strlen(vec[XS_WATCH_TOKEN]) != 3) goto out; -- To unsubscribe, e-mail: opensuse-virtual+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-virtual+help@opensuse.org
Justin T. Gibbs wrote:
The cdrom-removable.patch included in the Xen 4.0.0 package for OpenSuSE 11.2 causes qemu-dm to access an unitilaized variable in tools/ioemu-remote/xenstore.c. Below is a corrected version of the troublesome portion of that patch. My fix avoids the segmentation fault, but I have not verified that the intended functionality has been preserved.
We became aware of this today via the following bug report https://bugzilla.novell.com/show_bug.cgi?id=574046 Thanks for investigating and reporting on this list! Regards, Jim -- To unsubscribe, e-mail: opensuse-virtual+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-virtual+help@opensuse.org
participants (2)
-
Jim Fehlig
-
Justin T. Gibbs