summaryrefslogtreecommitdiff
path: root/src/basic/virt.c
diff options
context:
space:
mode:
authorChristopher Obbard <chris.obbard@collabora.com>2020-12-02 14:20:39 +0000
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-12-03 07:19:41 +0900
commitc8037dbf05da586b6a210ac04f145d99f424971f (patch)
tree08b8e54458264ac906d4346fa6d2d14b66b090a5 /src/basic/virt.c
parent0b261ac5be4bc8b3153df8b06d0be245d46b1fbf (diff)
downloadsystemd-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.c20
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;