Message ID | 1486198784-31523-1-git-send-email-ashijeetacharya@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 04/02/2017 00:59, Ashijeet Acharya wrote: > Commit a3a3d8c7 introduced a segfault bug while checking for > 'dc->vmsd->unmigratable' which caused QEMU to crash when trying to add > devices which do no set their 'dc->vmsd' yet while initialization. > Place a 'dc->vmsd' check prior to it so that we do not segfault for > such devices. > > NOTE: This doesn't compromise the functioning of --only-migratable > option as all the unmigratable devices do set their 'dc->vmsd'. > > Signed-off-by: Ashijeet Acharya <ashijeetacharya@gmail.com> > Reviewed-by: Juan Quintela <quintela@redhat.com> > --- > Changes in v2: > - place dc->vmsd check in hw/usb/bus.c as well > --- > hw/usb/bus.c | 2 +- > qdev-monitor.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/hw/usb/bus.c b/hw/usb/bus.c > index 1dcc35c..1e39b2c 100644 > --- a/hw/usb/bus.c > +++ b/hw/usb/bus.c > @@ -731,7 +731,7 @@ USBDevice *usbdevice_create(const char *cmdline) > > dc = DEVICE_CLASS(klass); > > - if (only_migratable) { > + if (only_migratable && dc->vmsd) { > if (dc->vmsd->unmigratable) { > error_report("Device %s is not migratable, but --only-migratable " > "was specified", f->name); > diff --git a/qdev-monitor.c b/qdev-monitor.c > index 549f45f..b72e5a4 100644 > --- a/qdev-monitor.c > +++ b/qdev-monitor.c > @@ -579,7 +579,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp) > return NULL; > } > > - if (only_migratable) { > + if (only_migratable && dc->vmsd) { > if (dc->vmsd->unmigratable) { > error_setg(errp, "Device %s is not migratable, but " > "--only-migratable was specified", driver); > Could you handle only_migratable in device_set_realized (inside "if (value && !dev->realized)"), to avoid the code duplication? Separate patch from this one, of course. Thanks, Paolo
diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 1dcc35c..1e39b2c 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -731,7 +731,7 @@ USBDevice *usbdevice_create(const char *cmdline) dc = DEVICE_CLASS(klass); - if (only_migratable) { + if (only_migratable && dc->vmsd) { if (dc->vmsd->unmigratable) { error_report("Device %s is not migratable, but --only-migratable " "was specified", f->name); diff --git a/qdev-monitor.c b/qdev-monitor.c index 549f45f..b72e5a4 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -579,7 +579,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp) return NULL; } - if (only_migratable) { + if (only_migratable && dc->vmsd) { if (dc->vmsd->unmigratable) { error_setg(errp, "Device %s is not migratable, but " "--only-migratable was specified", driver);