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.
This commit is contained in:
Guannan Ren 2012-11-01 19:43:03 +08:00
parent 2b435c153e
commit 1851a0c864
3 changed files with 19 additions and 3 deletions

View File

@ -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;

View File

@ -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");

View File

@ -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();