mirror of https://gitee.com/openkylin/libvirt.git
qemu: Fix segfault when host CPU is empty
In case libvirtd cannot detect host CPU model (which may happen if it runs inside a virtual machine), the daemon is likely to segfault when starting a new qemu domain. It segfaults when domain XML asks for host (either model or passthrough) CPU or does not ask for any specific CPU model at all.
This commit is contained in:
parent
286088567d
commit
2ccc4a607f
|
@ -3509,22 +3509,13 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
|
|||
|
||||
*hasHwVirt = false;
|
||||
|
||||
if (def->cpu &&
|
||||
(def->cpu->mode != VIR_CPU_MODE_CUSTOM || def->cpu->model)) {
|
||||
if (!(cpu = virCPUDefCopy(def->cpu)))
|
||||
goto cleanup;
|
||||
if (cpu->mode != VIR_CPU_MODE_CUSTOM &&
|
||||
!migrating &&
|
||||
cpuUpdate(cpu, host) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (STREQ(def->os.arch, "i686"))
|
||||
default_model = "qemu32";
|
||||
else
|
||||
default_model = "qemu64";
|
||||
|
||||
if (cpu) {
|
||||
if (def->cpu &&
|
||||
(def->cpu->mode != VIR_CPU_MODE_CUSTOM || def->cpu->model)) {
|
||||
virCPUCompareResult cmp;
|
||||
const char *preferred;
|
||||
int hasSVM;
|
||||
|
@ -3540,6 +3531,14 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(cpu = virCPUDefCopy(def->cpu)))
|
||||
goto cleanup;
|
||||
|
||||
if (cpu->mode != VIR_CPU_MODE_CUSTOM &&
|
||||
!migrating &&
|
||||
cpuUpdate(cpu, host) < 0)
|
||||
goto cleanup;
|
||||
|
||||
cmp = cpuGuestData(host, cpu, &data);
|
||||
switch (cmp) {
|
||||
case VIR_CPU_COMPARE_INCOMPATIBLE:
|
||||
|
@ -3648,7 +3647,8 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
|
|||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
cpuDataFree(host->arch, data);
|
||||
if (host)
|
||||
cpuDataFree(host->arch, data);
|
||||
virCPUDefFree(guest);
|
||||
virCPUDefFree(cpu);
|
||||
|
||||
|
|
Loading…
Reference in New Issue