Commit 1be312df authored by Dimitri John Ledkov's avatar Dimitri John Ledkov Committed by Simon McVittie
Browse files

Import Debian changes 237-3ubuntu10.1

systemd (237-3ubuntu10.1) bionic; urgency=medium

  [ Dimitri John Ledkov ]
  * hwdb: Fix wlan/rfkill keycode on Dell systems. (LP: #1762385)
  * Cherrypick upstream fix for corrected detection of Virtualbox & Xen.
    (LP: #1768104)
  * Further improve captive portal workarounds.
    Retry any NXDOMAIN results with lower feature levels, instead of just those
    with 'secure' in the domain name. (LP: #1766969)

  [ Michael Biebl ]
  * Add dependencies of libsystemd-shared to Pre-Depends.
    This is necessary so systemctl is functional at all times during a
    dist-upgrade. (Closes: #897986) (LP: #1771791)

  [ Mario Limonciello ]
  * Fix hibernate disk offsets.
    Configure resume offset via sysfs, to enable resume from a swapfile.
    (LP: #1760106)
parent 9ca5df38
systemd (237-3ubuntu10.1) bionic; urgency=medium
[ Dimitri John Ledkov ]
* hwdb: Fix wlan/rfkill keycode on Dell systems. (LP: #1762385)
* Cherrypick upstream fix for corrected detection of Virtualbox & Xen.
(LP: #1768104)
* Further improve captive portal workarounds.
Retry any NXDOMAIN results with lower feature levels, instead of just those
with 'secure' in the domain name. (LP: #1766969)
[ Michael Biebl ]
* Add dependencies of libsystemd-shared to Pre-Depends.
This is necessary so systemctl is functional at all times during a
dist-upgrade. (Closes: #897986) (LP: #1771791)
[ Mario Limonciello ]
* Fix hibernate disk offsets.
Configure resume offset via sysfs, to enable resume from a swapfile.
(LP: #1760106)
-- Dimitri John Ledkov <xnox@ubuntu.com> Mon, 21 May 2018 16:30:12 +0100
systemd (237-3ubuntu10) bionic; urgency=medium
* Create tmpfiles for persistent journal in postinst only when running
......
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 22 Mar 2018 16:53:26 +0100
Subject: [PATCH] macro: introduce TAKE_PTR() macro
This macro will read a pointer of any type, return it, and set the
pointer to NULL. This is useful as an explicit concept of passing
ownership of a memory area between pointers.
This takes inspiration from Rust:
https://doc.rust-lang.org/std/option/enum.Option.html#method.take
and was suggested by Alan Jenkins (@sourcejedi).
---
src/basic/alloc-util.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/basic/alloc-util.h b/src/basic/alloc-util.h
index 02dee37..3a3a7a9 100644
--- a/src/basic/alloc-util.h
+++ b/src/basic/alloc-util.h
@@ -128,3 +128,12 @@ void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size);
_new_ = alloca_align(_size_, (align)); \
(void*)memset(_new_, 0, _size_); \
})
+
+/* Takes inspiration from Rusts's Option::take() method: reads and returns a pointer, but at the same time resets it to
+ * NULL. See: https://doc.rust-lang.org/std/option/enum.Option.html#method.take */
+#define TAKE_PTR(ptr) \
+ ({ \
+ typeof(ptr) _ptr_ = (ptr); \
+ (ptr) = NULL; \
+ _ptr_; \
+ })
From: Mario Limonciello <mario.limonciello@dell.com>
Date: Thu, 8 Mar 2018 02:41:50 -0600
Subject: [PATCH] sleep: Add support for setting a disk offset when
hibernating
The Linux kernel is adding support for configuring the offset
into a disk. This allows swapfiles to be more usable as users
will no longer need to set the offset on their kernel command
line.
Use this API in systemd when hibernating as well.
Signed-off-by: Mario Limonciello <mario.limonciello@dell.com>
---
src/shared/sleep-config.c | 116 +++++++++++++++++++++++++++++++++++++++++-----
src/shared/sleep-config.h | 3 ++
src/sleep/sleep.c | 74 +++++++++++++++++++++++++++--
src/test/test-sleep.c | 43 ++++++++++++++++-
4 files changed, 220 insertions(+), 16 deletions(-)
diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c
index b430120..d6d13ee 100644
--- a/src/shared/sleep-config.c
+++ b/src/shared/sleep-config.c
@@ -20,6 +20,7 @@
***/
#include <errno.h>
+#include <linux/fs.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
@@ -187,13 +188,10 @@ int can_sleep_disk(char **types) {
#define HIBERNATION_SWAP_THRESHOLD 0.98
-static int hibernation_partition_size(size_t *size, size_t *used) {
+int find_hibernate_location(char **device, char **type, size_t *size, size_t *used) {
_cleanup_fclose_ FILE *f;
unsigned i;
- assert(size);
- assert(used);
-
f = fopen("/proc/swaps", "re");
if (!f) {
log_full(errno == ENOENT ? LOG_DEBUG : LOG_WARNING,
@@ -205,7 +203,7 @@ static int hibernation_partition_size(size_t *size, size_t *used) {
(void) fscanf(f, "%*s %*s %*s %*s %*s\n");
for (i = 1;; i++) {
- _cleanup_free_ char *dev = NULL, *type = NULL;
+ _cleanup_free_ char *dev_field = NULL, *type_field = NULL;
size_t size_field, used_field;
int k;
@@ -215,7 +213,7 @@ static int hibernation_partition_size(size_t *size, size_t *used) {
"%zu " /* swap size */
"%zu " /* used */
"%*i\n", /* priority */
- &dev, &type, &size_field, &used_field);
+ &dev_field, &type_field, &size_field, &used_field);
if (k != 4) {
if (k == EOF)
break;
@@ -224,13 +222,18 @@ static int hibernation_partition_size(size_t *size, size_t *used) {
continue;
}
- if (streq(type, "partition") && endswith(dev, "\\040(deleted)")) {
- log_warning("Ignoring deleted swapfile '%s'.", dev);
+ if (streq(type_field, "partition") && endswith(dev_field, "\\040(deleted)")) {
+ log_warning("Ignoring deleted swapfile '%s'.", dev_field);
continue;
}
-
- *size = size_field;
- *used = used_field;
+ if (device)
+ *device = TAKE_PTR(dev_field);
+ if (type)
+ *type = TAKE_PTR(type_field);
+ if (size)
+ *size = size_field;
+ if (used)
+ *used = used_field;
return 0;
}
@@ -253,7 +256,7 @@ static bool enough_memory_for_hibernation(void) {
if (access("/sys/power/tuxonice", F_OK) == 0)
return true;
- r = hibernation_partition_size(&size, &used);
+ r = find_hibernate_location(NULL, NULL, &size, &used);
if (r < 0)
return false;
@@ -277,6 +280,95 @@ static bool enough_memory_for_hibernation(void) {
return r;
}
+int read_fiemap(int fd, struct fiemap **ret) {
+ _cleanup_free_ struct fiemap *fiemap = NULL, *result_fiemap = NULL;
+ int extents_size;
+ struct stat statinfo;
+ uint32_t result_extents = 0;
+ uint64_t fiemap_start = 0, fiemap_length;
+ size_t fiemap_size = 1, result_fiemap_size = 1;
+
+ if (fstat(fd, &statinfo) < 0)
+ return log_debug_errno(errno, "Cannot determine file size: %m");
+ if (!S_ISREG(statinfo.st_mode))
+ return -ENOTTY;
+ fiemap_length = statinfo.st_size;
+
+ /* zero this out in case we run on a file with no extents */
+ fiemap = new0(struct fiemap, 1);
+ if (!fiemap)
+ return -ENOMEM;
+
+ result_fiemap = new(struct fiemap, 1);
+ if (!result_fiemap)
+ return -ENOMEM;
+
+ /* XFS filesystem has incorrect implementation of fiemap ioctl and
+ * returns extents for only one block-group at a time, so we need
+ * to handle it manually, starting the next fiemap call from the end
+ * of the last extent
+ */
+ while (fiemap_start < fiemap_length) {
+ *fiemap = (struct fiemap) {
+ .fm_start = fiemap_start,
+ .fm_length = fiemap_length,
+ .fm_flags = FIEMAP_FLAG_SYNC,
+ };
+
+ /* Find out how many extents there are */
+ if (ioctl(fd, FS_IOC_FIEMAP, fiemap) < 0)
+ return log_debug_errno(errno, "Failed to read extents: %m");
+
+ /* Nothing to process */
+ if (fiemap->fm_mapped_extents == 0)
+ break;
+
+ /* Result fiemap has to hold all the extents for the whole file */
+ extents_size = DIV_ROUND_UP(sizeof(struct fiemap_extent) * fiemap->fm_mapped_extents,
+ sizeof(struct fiemap));
+
+ /* Resize fiemap to allow us to read in the extents */
+ if (!GREEDY_REALLOC0(fiemap, fiemap_size, extents_size))
+ return -ENOMEM;
+
+ fiemap->fm_extent_count = fiemap->fm_mapped_extents;
+ fiemap->fm_mapped_extents = 0;
+
+ if (ioctl(fd, FS_IOC_FIEMAP, fiemap) < 0)
+ return log_debug_errno(errno, "Failed to read extents: %m");
+
+ extents_size = DIV_ROUND_UP(sizeof(struct fiemap_extent) * (result_extents + fiemap->fm_mapped_extents),
+ sizeof(struct fiemap));
+
+ /* Resize result_fiemap to allow us to read in the extents */
+ if (!GREEDY_REALLOC(result_fiemap, result_fiemap_size,
+ extents_size))
+ return -ENOMEM;
+
+ memcpy(result_fiemap->fm_extents + result_extents,
+ fiemap->fm_extents,
+ sizeof(struct fiemap_extent) * fiemap->fm_mapped_extents);
+
+ result_extents += fiemap->fm_mapped_extents;
+
+ /* Highly unlikely that it is zero */
+ if (fiemap->fm_mapped_extents > 0) {
+ uint32_t i = fiemap->fm_mapped_extents - 1;
+
+ fiemap_start = fiemap->fm_extents[i].fe_logical +
+ fiemap->fm_extents[i].fe_length;
+
+ if (fiemap->fm_extents[i].fe_flags & FIEMAP_EXTENT_LAST)
+ break;
+ }
+ }
+
+ memcpy(result_fiemap, fiemap, sizeof(struct fiemap));
+ result_fiemap->fm_mapped_extents = result_extents;
+ *ret = TAKE_PTR(result_fiemap);
+ return 0;
+}
+
static bool can_s2h(void) {
int r;
diff --git a/src/shared/sleep-config.h b/src/shared/sleep-config.h
index 3dacda0..b91a4b2 100644
--- a/src/shared/sleep-config.h
+++ b/src/shared/sleep-config.h
@@ -20,9 +20,12 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
+#include <linux/fiemap.h>
#include "time-util.h"
+int read_fiemap(int fd, struct fiemap **ret);
int parse_sleep_config(const char *verb, char ***modes, char ***states, usec_t *delay);
+int find_hibernate_location(char **device, char **type, size_t *size, size_t *used);
int can_sleep(const char *verb);
int can_sleep_disk(char **types);
diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
index 2830b23..1163a0f 100644
--- a/src/sleep/sleep.c
+++ b/src/sleep/sleep.c
@@ -4,6 +4,7 @@
Copyright 2012 Lennart Poettering
Copyright 2013 Zbigniew Jędrzejewski-Szmek
+ Copyright 2010-2017 Canonical
Copyright 2018 Dell Inc.
systemd is free software; you can redistribute it and/or modify it
@@ -22,6 +23,7 @@
#include <errno.h>
#include <getopt.h>
+#include <linux/fiemap.h>
#include <stdio.h>
#include "sd-messages.h"
@@ -40,6 +42,67 @@
static char* arg_verb = NULL;
+static int write_hibernate_location_info(void) {
+ _cleanup_free_ char *device = NULL, *type = NULL;
+ _cleanup_free_ struct fiemap *fiemap = NULL;
+ char offset_str[DECIMAL_STR_MAX(uint64_t)];
+ char device_str[DECIMAL_STR_MAX(uint64_t)];
+ _cleanup_close_ int fd = -1;
+ struct stat stb;
+ uint64_t offset;
+ int r;
+
+ r = find_hibernate_location(&device, &type, NULL, NULL);
+ if (r < 0)
+ return log_debug_errno(r, "Unable to find hibernation location: %m");
+
+ /* if it's a swap partition, we just write the disk to /sys/power/resume */
+ if (streq(type, "partition"))
+ return write_string_file("/sys/power/resume", device, 0);
+ else if (!streq(type, "file"))
+ return log_debug_errno(EINVAL, "Invalid hibernate type %s: %m",
+ type);
+
+ /* Only available in 4.17+ */
+ if (access("/sys/power/resume_offset", F_OK) < 0) {
+ if (errno == ENOENT)
+ return 0;
+ return log_debug_errno(errno, "/sys/power/resume_offset unavailable: %m");
+ }
+
+ r = access("/sys/power/resume_offset", W_OK);
+ if (r < 0)
+ return log_debug_errno(errno, "/sys/power/resume_offset not writeable: %m");
+
+ fd = open(device, O_RDONLY | O_CLOEXEC | O_NONBLOCK);
+ if (fd < 0)
+ return log_debug_errno(errno, "Unable to open '%s': %m", device);
+ r = fstat(fd, &stb);
+ if (r < 0)
+ return log_debug_errno(errno, "Unable to stat %s: %m", device);
+ r = read_fiemap(fd, &fiemap);
+ if (r < 0)
+ return log_debug_errno(r, "Unable to read extent map for '%s': %m",
+ device);
+ if (fiemap->fm_mapped_extents == 0) {
+ log_debug("No extents found in '%s'", device);
+ return -EINVAL;
+ }
+ offset = fiemap->fm_extents[0].fe_physical / page_size();
+ xsprintf(offset_str, "%" PRIu64, offset);
+ r = write_string_file("/sys/power/resume_offset", offset_str, 0);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to write offset '%s': %m",
+ offset_str);
+
+ xsprintf(device_str, "%lx", (unsigned long)stb.st_dev);
+ r = write_string_file("/sys/power/resume", device_str, 0);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to write device '%s': %m",
+ device_str);
+ return 0;
+}
+
static int write_mode(char **modes) {
int r = 0;
char **mode;
@@ -110,9 +173,14 @@ static int execute(char **modes, char **states) {
return log_error_errno(errno, "Failed to open /sys/power/state: %m");
/* Configure the hibernation mode */
- r = write_mode(modes);
- if (r < 0)
- return r;
+ if (!strv_isempty(modes)) {
+ r = write_hibernate_location_info();
+ if (r < 0)
+ return log_error_errno(r, "Failed to write hibernation disk offset: %m");
+ r = write_mode(modes);
+ if (r < 0)
+ return r;
+ }
execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, arguments);
diff --git a/src/test/test-sleep.c b/src/test/test-sleep.c
index cea511d..05fd6c0 100644
--- a/src/test/test-sleep.c
+++ b/src/test/test-sleep.c
@@ -18,13 +18,43 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
+#include <linux/fiemap.h>
#include <stdio.h>
+#include "fd-util.h"
#include "log.h"
#include "sleep-config.h"
#include "strv.h"
#include "util.h"
+static int test_fiemap(const char *path) {
+ _cleanup_free_ struct fiemap *fiemap = NULL;
+ _cleanup_close_ int fd = -1;
+ int r;
+
+ fd = open(path, O_RDONLY | O_CLOEXEC | O_NONBLOCK);
+ if (fd < 0)
+ return log_error_errno(errno, "failed to open %s: %m", path);
+ r = read_fiemap(fd, &fiemap);
+ if (r == -ENOTSUP) {
+ log_info("Skipping test, not supported");
+ exit(EXIT_TEST_SKIP);
+ }
+ if (r < 0)
+ return log_error_errno(r, "Unable to read extent map for '%s': %m", path);
+ log_info("extent map information for %s:", path);
+ log_info("\t start: %llu", fiemap->fm_start);
+ log_info("\t length: %llu", fiemap->fm_length);
+ log_info("\t flags: %u", fiemap->fm_flags);
+ log_info("\t number of mapped extents: %u", fiemap->fm_mapped_extents);
+ log_info("\t extent count: %u", fiemap->fm_extent_count);
+ if (fiemap->fm_extent_count > 0)
+ log_info("\t first extent location: %llu",
+ fiemap->fm_extents[0].fe_physical / page_size());
+
+ return 0;
+}
+
static void test_sleep(void) {
_cleanup_strv_free_ char
**standby = strv_new("standby", NULL),
@@ -52,6 +82,8 @@ static void test_sleep(void) {
}
int main(int argc, char* argv[]) {
+ int i, r = 0, k;
+
log_parse_environment();
log_open();
@@ -60,5 +92,14 @@ int main(int argc, char* argv[]) {
test_sleep();
- return 0;
+ if (argc <= 1)
+ assert_se(test_fiemap(argv[0]) == 0);
+ else
+ for (i = 1; i < argc; i++) {
+ k = test_fiemap(argv[i]);
+ if (r == 0)
+ r = k;
+ }
+
+ return r;
}
From: Kai-Heng Feng <kaihengfeng@gmail.com>
Date: Mon, 23 Apr 2018 16:23:03 +0800
Subject: hwdb: Use wlan keycode for all Dell systems (#8762)
Once the seat is acquired, gnome-settings-daemon (GSD) takes full
control of rfkill by sending RFKILL_IOCTL_NOINPUT ioctl to disable
rfkill control in kernel.
Since GSD expects wlan keycode when the hotkey gets pressed, we should
change the "unknown" to "wlan" accordingly.
Tested under both GNOME and KDE.
(cherry picked from commit cab01e9ecf1c69656785e64f5fc94cd4ed09e57f)
---
hwdb/60-keyboard.hwdb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hwdb/60-keyboard.hwdb b/hwdb/60-keyboard.hwdb
index a265f12..262e772 100644
--- a/hwdb/60-keyboard.hwdb
+++ b/hwdb/60-keyboard.hwdb
@@ -263,7 +263,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pn*
KEYBOARD_KEY_85=brightnessdown # Fn+Down Brightness Down
KEYBOARD_KEY_86=brightnessup # Fn+Up Brightness Up
KEYBOARD_KEY_87=battery # Fn+F3 battery icon
- KEYBOARD_KEY_88=unknown # Fn+F2 Turn On/Off Wireless - handled in hardware
+ KEYBOARD_KEY_88=!wlan # Fn+(F2|PrtScr|Home) Turn On/Off Wireless
KEYBOARD_KEY_89=ejectclosecd # Fn+F10 Eject CD
KEYBOARD_KEY_8a=suspend # Fn+F1 hibernate
KEYBOARD_KEY_8b=switchvideomode # Fn+F8 CRT/LCD (high keycode: "displaytoggle")
......@@ -5,17 +5,18 @@ Subject: resolved: Mitigate DVE-2018-0001,
Some captive portals, lie and do not respond with the captive portal IP
address, if the query is with EDNS0 enabled and DO bit set to zero. Thus retry
"secure" domain name look ups with less secure methods, upon NXDOMAIN.
all domain name look ups with less secure methods, upon NXDOMAIN.
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bionic/+source/systemd/+bug/1766969
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bionic/+source/systemd/+bug/1727237
Bug-DNS: https://github.com/dns-violations/dns-violations/blob/master/2018/DVE-2018-0001.md
(cherry picked from commit cc0a0eb1a9379a81256d68d65f8450a487c0ab12)
---
src/resolve/resolved-dns-transaction.c | 44 ++++++++++++++++++++++++++++++----
1 file changed, 39 insertions(+), 5 deletions(-)
src/resolve/resolved-dns-transaction.c | 38 +++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c
index f4bbde0..7f18116 100644
index f4bbde0..f500ec2 100644
--- a/src/resolve/resolved-dns-transaction.c
+++ b/src/resolve/resolved-dns-transaction.c
@@ -388,12 +388,12 @@ static int dns_transaction_pick_server(DnsTransaction *t) {
......@@ -36,7 +37,7 @@ index f4bbde0..7f18116 100644
/* Clamp the feature level if that is requested. */
if (t->clamp_feature_level != _DNS_SERVER_FEATURE_LEVEL_INVALID &&
@@ -954,6 +954,40 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
@@ -954,6 +954,34 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
return;
}
......@@ -58,20 +59,14 @@ index f4bbde0..7f18116 100644
+ * This is reported as https://github.com/dns-violations/dns-violations/blob/master/2018/DVE-2018-0001.md
+ */
+ if (DNS_PACKET_RCODE(p) == DNS_RCODE_NXDOMAIN && t->current_feature_level >= DNS_SERVER_FEATURE_LEVEL_EDNS0) {
+
+ char key_str[DNS_RESOURCE_KEY_STRING_MAX];
+ dns_resource_key_to_string(t->key, key_str, sizeof key_str);
+ if (strstr(key_str, "secure") != NULL) {
+ t->current_feature_level = t->current_feature_level - 1;
+
+ log_warning("Server returned error %s, suspecting DNS violation DVE-2018-0001, retrying transaction with reduced feature level %s.",
+ dns_rcode_to_string(DNS_PACKET_RCODE(p)),
+ dns_server_feature_level_to_string(t->current_feature_level));
+
+ dns_transaction_retry(t, false /* use the same server */);
+ return;
+ }
+
+ t->current_feature_level = t->current_feature_level - 1;
+ log_warning("Server returned error %s, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level %s.",
+ dns_rcode_to_string(DNS_PACKET_RCODE(p)),
+ dns_server_feature_level_to_string(t->current_feature_level));
+ dns_transaction_retry(t, false /* use the same server */);
+ return;
+ }
+
if (DNS_PACKET_RCODE(p) == DNS_RCODE_REFUSED) {
......
......@@ -12,6 +12,8 @@ test-test-functions-on-PPC64-use-hvc0-console.patch
test-masked-unit-with-drop-ins.patch
install-detect-masked-unit-with-drop-ins.patch
resolved-Mitigate-DVE-2018-0001-by-retrying-NXDOMAIN-with.patch
hwdb-Use-wlan-keycode-for-all-Dell-systems-8762.patch
virt-if-we-detect-Xen-by-DMI-trust-that-over-CPUID.patch
debian/Use-Debian-specific-config-files.patch
debian/don-t-try-to-start-autovt-units-when-not-running-wit.patch
debian/Make-logind-hostnamed-localed-timedated-D-Bus-activa.patch
......@@ -57,3 +59,5 @@ debian/UBUNTU-shared-sleep-config-fix-unitialized-variable-and-use.patch
debian/UBUNTU-Rename-suspend-to-hibernate-to-suspend-then-hibernat.patch
debian/UBUNTU-resolved-Listen-on-both-TCP-and-UDP-by-default.patch
debian/UBUNTU-networkd-if-RA-was-implicit-do-not-await-ndisc_con.patch
debian/UBUNTU-introduce-TAKE_PTR-macro.patch
debian/UBUNTU-sleep-Add-support-for-setting-a-disk-offset.patch
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 30 Apr 2018 12:23:03 +0200
Subject: virt: if we detect Xen by DMI, trust that over CPUID
Apparently Xen sometimes lies about its identity when queried via CPUID.
Let's hence prefer DMI tests for CPUID
Fixes: #8844
(cherry picked from commit f2fe2865cd19cd4318b82d01b9b62d22b1697b3a)
---
src/basic/virt.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/basic/virt.c b/src/basic/virt.c
index f4796b5..1bc26ec 100644
--- a/src/basic/virt.c
+++ b/src/basic/virt.c
@@ -327,13 +327,16 @@ int detect_vm(void) {
/* We have to use the correct order here:
*
- * -> First try to detect Oracle Virtualbox, even if it uses KVM.
- * -> Second try to detect from cpuid, this will report KVM for
- * whatever software is used even if info in dmi is overwritten.
- * -> Third try to detect from dmi. */
+ * → First, try to detect Oracle Virtualbox, even if it uses KVM, as well as Xen even if it cloaks as Microsoft
+ * Hyper-V.
+ *
+ * → Second, try to detect from CPUID, this will report KVM for whatever software is used even if info in DMI is
+ * overwritten.
+ *
+ * → Third, try to detect from DMI. */
dmi = detect_vm_dmi();
- if (dmi == VIRTUALIZATION_ORACLE) {
+ if (IN_SET(dmi, VIRTUALIZATION_ORACLE, VIRTUALIZATION_XEN)) {
r = dmi;
goto finish;
}
......@@ -261,15 +261,21 @@ endif
override_dh_installinit:
dh_installinit --no-start
PROJECT_VERSION ?= $(shell awk '/PACKAGE_VERSION/ {print $$3}' build-deb/config.h | tr -d \")
# The SysV compat tools (which are symlinks to systemctl) are