]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevadm: gracefully handle when a maked file is specified to udevadm verify/cat
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 13 Jan 2026 06:48:56 +0000 (15:48 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 16 Jan 2026 14:05:33 +0000 (23:05 +0900)
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
test/units/TEST-17-UDEV.sanity-check.sh
test/units/TEST-17-UDEV.verify.sh

index 1ab9b0c8ca4b3e1abbc264fb3d80660e33648392..04005cc3666c6c534cdda70ee5f32923b19d67cb 100644 (file)
@@ -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();
index 98a277a47eb1301c2d7b211e24f8243c913670fe..5f1a93e78f5a6a92eb0ffa8e883d3bd063108042 100755 (executable)
@@ -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
 
index 5b6baa428029d1e7d947027c101a8ec3e559d3e8..66f34a3e36f94f524b3410a2867198b16eaec4cb 100755 (executable)
@@ -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}"