From f1ad2c9238f03198a05e36167397d24983ebc527 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 14 Feb 2022 13:33:43 +0100 Subject: [PATCH 1/2] sd-device: refuse opening device mit major/minor of zero early device nodes with 0 dev_t are not real (and for that reason such inodes are used as whiteouts in overlayfs, for example), hence refuse them early. It seems wrong going to sysfs for something we know can't exist anyway. --- src/libsystemd/sd-device/sd-device.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 27c91ea724..c9ce3b5c58 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -248,6 +248,10 @@ _public_ int sd_device_new_from_devnum(sd_device **ret, char type, dev_t devnum) assert_return(ret, -EINVAL); assert_return(IN_SET(type, 'b', 'c'), -EINVAL); + if (devnum == 0) + return log_debug_errno(SYNTHETIC_ERRNO(ENODEV), + "sd-device: Attempted to allocate device by zero major/minor, refusing."); + /* use /sys/dev/{block,char}/: link */ xsprintf(id, "%u:%u", major(devnum), minor(devnum)); From d5cb053cd93d516f516e0b748271b55f9dfb3a29 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 14 Feb 2022 13:35:27 +0100 Subject: [PATCH 2/2] gpt-auto: properly handle case where we can't determine devno of /usr/ fs get_block_device_harder() returns == 0 if the fs is valid, but it is not backed by a single devno. (As opposed to returning > 0 if the devno is valid). Let's catch this case and log a clear message, and don't bother open the device in that case. This is mostly cosmetical, as either way, systemd-gpt-auto-generator doesn't work in scenarios like that. Prompted-by: #22504 --- src/gpt-auto-generator/gpt-auto-generator.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index 64ca9bb2f9..28982a4c34 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -779,12 +779,16 @@ static int add_mounts(void) { return btrfs_log_dev_root(LOG_ERR, r, "root file system"); if (r < 0) return log_error_errno(r, "Failed to determine block device of root file system: %m"); - if (r == 0) { /* Not backed by block device */ + if (r == 0) { /* Not backed by a single block device. (Could be NFS or so, or could be multi-device RAID or so) */ r = get_block_device_harder("/usr", &devno); if (r == -EUCLEAN) return btrfs_log_dev_root(LOG_ERR, r, "/usr"); if (r < 0) - return log_error_errno(r, "Failed to determine block device of /usr file system: %m"); + return log_error_errno(r, "Failed to determine block device of /usr/ file system: %m"); + if (r == 0) { /* /usr/ not backed by single block device, either. */ + log_debug("Neither root nor /usr/ file system are on a (single) block device."); + return 0; + } } } else if (r < 0) return log_error_errno(r, "Failed to read symlink /run/systemd/volatile-root: %m");