From 782569afd05b97143938ec294b5a28b4f2ffb75c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 13 Jan 2026 15:48:56 +0900 Subject: [PATCH] udevadm: gracefully handle when a maked file is specified to udevadm verify/cat Previously, since 7cb4508c5af465ab1be1b103e6c2b613eb58e63c, if a masked file is specified, the commands failed. Let's warn that the file is masked and ignore the file. --- src/udev/udevadm-util.c | 12 ++++++++++-- test/units/TEST-17-UDEV.sanity-check.sh | 2 +- test/units/TEST-17-UDEV.verify.sh | 3 +-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/udev/udevadm-util.c b/src/udev/udevadm-util.c index 1ab9b0c8ca..04005cc366 100644 --- a/src/udev/udevadm-util.c +++ b/src/udev/udevadm-util.c @@ -248,7 +248,11 @@ static int search_rules_file_in_conf_dirs(const char *s, const char *root, ConfF return log_oom(); _cleanup_(conf_file_freep) ConfFile *c = NULL; - r = conf_file_new(path, root, CONF_FILES_REGULAR, &c); + r = conf_file_new(path, root, CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED, &c); + if (r == -ERFKILL) { + log_warning_errno(r, "File '%s%s' is a mask, ignoring.", empty_to_root(root), skip_leading_slash(path)); + return 1; /* Found masked file. */ + } if (r == -ENOENT) continue; if (r < 0) @@ -278,7 +282,11 @@ static int search_rules_file(const char *s, const char *root, ConfFile ***files, /* If not found, or if it is a path, then chase it. */ _cleanup_(conf_file_freep) ConfFile *c = NULL; - r = conf_file_new(s, root, CONF_FILES_REGULAR, &c); + r = conf_file_new(s, root, CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED, &c); + if (r == -ERFKILL) { + log_warning_errno(r, "File '%s%s' is a mask, ignoring.", empty_to_root(root), skip_leading_slash(s)); + return 0; /* Found masked file. */ + } if (r >= 0) { if (!GREEDY_REALLOC_APPEND(*files, *n_files, &c, 1)) return log_oom(); diff --git a/test/units/TEST-17-UDEV.sanity-check.sh b/test/units/TEST-17-UDEV.sanity-check.sh index 98a277a47e..5f1a93e78f 100755 --- a/test/units/TEST-17-UDEV.sanity-check.sh +++ b/test/units/TEST-17-UDEV.sanity-check.sh @@ -38,7 +38,7 @@ udevadm cat 99-systemd udevadm cat 99-systemd.rules udevadm cat /usr/lib/udev/rules.d/99-systemd.rules udevadm cat /usr/lib/udev/rules.d -(! udevadm cat /dev/null) +udevadm cat /dev/null udevadm cat --config udevadm cat -h diff --git a/test/units/TEST-17-UDEV.verify.sh b/test/units/TEST-17-UDEV.verify.sh index 5b6baa4280..66f34a3e36 100755 --- a/test/units/TEST-17-UDEV.verify.sh +++ b/test/units/TEST-17-UDEV.verify.sh @@ -118,8 +118,7 @@ assert_1 --resolve-names=now assert_1 ./nosuchfile # Failed to parse rules file ./nosuchfile: No such file or directory assert_1 ./nosuchfile /dev/null -# '/dev/null' is neither a regular file nor a directory: File descriptor in bad state -assert_1 /dev/null +assert_0 /dev/null rules_dir='etc/udev/rules.d' mkdir -p "${rules_dir}"