From 1851a0c8640f0b42e20a2ccfd5cdb9a9409517ec Mon Sep 17 00:00:00 2001 From: Guannan Ren Date: Thu, 1 Nov 2012 19:43:03 +0800 Subject: [PATCH] qemu: use default machine type if missing it in qemu command line BZ:https://bugzilla.redhat.com/show_bug.cgi?id=871273 when using virsh qemu-attach to attach an existing qemu process, if it misses the -M option in qemu command line, libvirtd crashed because the NULL value of def->os.machine in later use. Example: /usr/libexec/qemu-kvm -name foo \ -cdrom /var/lib/libvirt/images/boot.img \ -monitor unix:/tmp/demo,server,nowait \ error: End of file while reading data: Input/output error error: Failed to reconnect to the hypervisor This patch tries to set default machine type if the value of def->os.machine is still NULL after qemu command line parsing. --- src/qemu/qemu_capabilities.c | 4 +++- src/qemu/qemu_command.c | 11 +++++++++++ src/qemu/qemu_driver.c | 7 +++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 9396a9b704..5c4f5185b7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1845,10 +1845,12 @@ no_memory: const char *qemuCapsGetCanonicalMachine(qemuCapsPtr caps, const char *name) - { size_t i; + if (!name) + return NULL; + for (i = 0 ; i < caps->nmachineTypes ; i++) { if (!caps->machineAliases[i]) continue; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fe99f5d64a..0b6d2f8143 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8768,6 +8768,17 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, } } + if (!def->os.machine) { + const char *defaultMachine = + virCapabilitiesDefaultGuestMachine(caps, + def->os.type, + def->os.arch, + virDomainVirtTypeToString(def->virtType)); + if (defaultMachine != NULL) + if (!(def->os.machine = strdup(defaultMachine))) + goto no_memory; + } + if (!nographics && def->ngraphics == 0) { virDomainGraphicsDefPtr sdl; const char *display = qemuFindEnv(progenv, "DISPLAY"); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 267bbf175c..15f4211825 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1517,9 +1517,12 @@ static int qemudNumDomains(virConnectPtr conn) { static int qemuCanonicalizeMachine(virDomainDefPtr def, qemuCapsPtr caps) { - const char *canon = qemuCapsGetCanonicalMachine(caps, def->os.machine); + const char *canon; - if (canon != def->os.machine) { + if (!(canon = qemuCapsGetCanonicalMachine(caps, def->os.machine))) + return 0; + + if (STRNEQ(canon, def->os.machine)) { char *tmp; if (!(tmp = strdup(canon))) { virReportOOMError(); -- 2.39.5