diff options
author | Christopher Obbard <chris.obbard@collabora.com> | 2020-12-02 14:20:39 +0000 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-12-03 07:19:41 +0900 |
commit | c8037dbf05da586b6a210ac04f145d99f424971f (patch) | |
tree | 08b8e54458264ac906d4346fa6d2d14b66b090a5 /src/basic/virt.c | |
parent | 0b261ac5be4bc8b3153df8b06d0be245d46b1fbf (diff) | |
download | systemd-c8037dbf05da586b6a210ac04f145d99f424971f.tar.gz |
virt: Properly detect nested UML inside another hypervisor
UML runs as a user-process so it can quite easily be ran inside of
another hypervisor, for instance inside a KVM instance. UML passes
through the CPUID from the host machine so in this case detect_vm
incorrectly identifies as running under KVM. So check we are running
a UML kernel first, before we check any other hypervisors.
Resolves: #17754
Signed-off-by: Christopher Obbard <chris.obbard@collabora.com>
Diffstat (limited to 'src/basic/virt.c')
-rw-r--r-- | src/basic/virt.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/basic/virt.c b/src/basic/virt.c index 1b90f4b008..7d78a402b3 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -345,7 +345,7 @@ int detect_vm(void) { /* We have to use the correct order here: * * → First, try to detect Oracle Virtualbox, even if it uses KVM, as well as Xen even if it cloaks as Microsoft - * Hyper-V. + * Hyper-V. Attempt to detect uml at this stage also since it runs as a user-process nested inside other VMs. * * → Second, try to detect from CPUID, this will report KVM for whatever software is used even if info in DMI is * overwritten. @@ -358,6 +358,16 @@ int detect_vm(void) { goto finish; } + /* Detect UML */ + r = detect_vm_uml(); + if (r < 0) + return r; + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else if (r != VIRTUALIZATION_NONE) + goto finish; + + /* Detect from CPUID */ r = detect_vm_cpuid(); if (r < 0) return r; @@ -406,14 +416,6 @@ int detect_vm(void) { else if (r != VIRTUALIZATION_NONE) goto finish; - r = detect_vm_uml(); - if (r < 0) - return r; - if (r == VIRTUALIZATION_VM_OTHER) - other = true; - else if (r != VIRTUALIZATION_NONE) - goto finish; - r = detect_vm_zvm(); if (r < 0) return r; |