[libvirt] [PATCH] Fix QEMU migration cookie crash for guests with no graphics

When generating a cookie for a guest with no data, the QEMU_MIGRATION_COOKIE_GRAPHICS flag was set even if no graphics data was added. Avoid setting the flag unless it was needed, also add a safety check for mig->graphics being non-NULL * src/qemu/qemu_migration.c: Avoid cookie crash for guest with no graphics --- src/qemu/qemu_migration.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index fcf8f9c..4d7bc38 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -252,11 +252,12 @@ qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig, if (dom->def->ngraphics == 1 && (dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC || - dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) && - !(mig->graphics = qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) - return -1; - - mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE)) { + if (!(mig->graphics = + qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) + return -1; + mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + } return 0; } @@ -295,7 +296,8 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf, virBufferEscapeString(buf, " <hostname>%s</hostname>\n", mig->hostname); virBufferAsprintf(buf, " <hostuuid>%s</hostuuid>\n", hostuuidstr); - if (mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) + if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) && + mig->graphics) qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics); virBufferAddLit(buf, "</qemu-migration>\n"); -- 1.7.4.4

On 05/18/2011 11:08 AM, Daniel P. Berrange wrote:
When generating a cookie for a guest with no data, the QEMU_MIGRATION_COOKIE_GRAPHICS flag was set even if no graphics data was added. Avoid setting the flag unless it was needed, also add a safety check for mig->graphics being non-NULL
* src/qemu/qemu_migration.c: Avoid cookie crash for guest with no graphics --- src/qemu/qemu_migration.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-)
ACK. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

At 05/19/2011 01:08 AM, Daniel P. Berrange Write:
When generating a cookie for a guest with no data, the QEMU_MIGRATION_COOKIE_GRAPHICS flag was set even if no graphics data was added. Avoid setting the flag unless it was needed, also add a safety check for mig->graphics being non-NULL
* src/qemu/qemu_migration.c: Avoid cookie crash for guest with no graphics --- src/qemu/qemu_migration.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index fcf8f9c..4d7bc38 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -252,11 +252,12 @@ qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig,
if (dom->def->ngraphics == 1 && (dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC || - dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) && - !(mig->graphics = qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) - return -1; - - mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE)) { + if (!(mig->graphics = + qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) + return -1; + mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + }
return 0; } @@ -295,7 +296,8 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf, virBufferEscapeString(buf, " <hostname>%s</hostname>\n", mig->hostname); virBufferAsprintf(buf, " <hostuuid>%s</hostuuid>\n", hostuuidstr);
- if (mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) + if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) && + mig->graphics) qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics);
virBufferAddLit(buf, "</qemu-migration>\n");
This duplicates my patch: https://www.redhat.com/archives/libvir-list/2011-May/msg01095.html

On Thu, May 19, 2011 at 08:41:48AM +0800, Wen Congyang wrote:
At 05/19/2011 01:08 AM, Daniel P. Berrange Write:
When generating a cookie for a guest with no data, the QEMU_MIGRATION_COOKIE_GRAPHICS flag was set even if no graphics data was added. Avoid setting the flag unless it was needed, also add a safety check for mig->graphics being non-NULL
* src/qemu/qemu_migration.c: Avoid cookie crash for guest with no graphics --- src/qemu/qemu_migration.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index fcf8f9c..4d7bc38 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -252,11 +252,12 @@ qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig,
if (dom->def->ngraphics == 1 && (dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC || - dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) && - !(mig->graphics = qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) - return -1; - - mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE)) { + if (!(mig->graphics = + qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) + return -1; + mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + }
return 0; } @@ -295,7 +296,8 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf, virBufferEscapeString(buf, " <hostname>%s</hostname>\n", mig->hostname); virBufferAsprintf(buf, " <hostuuid>%s</hostuuid>\n", hostuuidstr);
- if (mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) + if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) && + mig->graphics) qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics);
virBufferAddLit(buf, "</qemu-migration>\n");
This duplicates my patch:
https://www.redhat.com/archives/libvir-list/2011-May/msg01095.html
I fixed it with the second chunk of this patch originally, but pulled in the change that you made too, for added safety. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Wen Congyang