]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-rules: move udev_check_rule_line() invocation
authorDmitry V. Levin <ldv@strace.io>
Wed, 22 Mar 2023 08:00:00 +0000 (08:00 +0000)
committerDmitry V. Levin <ldv@strace.io>
Mon, 27 Mar 2023 10:00:30 +0000 (10:00 +0000)
Move udev_check_rule_line() invocation from udev_rule_file_get_issues()
to udev_rules_parse_file(), invoke udev_check_rule_line() only when
udev_rules_parse_file() is called by udevadm verify.

Subsequent commits are going to perform more checks invoked from
udev_rules_parse_file().

src/udev/fuzz-udev-rules.c
src/udev/udev-rules.c
src/udev/udev-rules.h
src/udev/udevadm-verify.c

index 1d487b94eece33d48da7ba3b632cc3e2d1483827..aff176eb1bddcb701cd5f7806edf0a552f3d6249 100644 (file)
@@ -27,7 +27,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         fflush(f);
 
         assert_se(rules = udev_rules_new(RESOLVE_NAME_EARLY));
-        r = udev_rules_parse_file(rules, filename, NULL);
+        r = udev_rules_parse_file(rules, filename, /* extra_checks = */ false, NULL);
         log_info_errno(r, "Parsing %s: %m", filename);
         assert_se(r >= 0 ||             /* OK */
                   r == -ENOBUFS);       /* line length exceeded */
index 1d1c27edd099c3696a49e0a0578f029cc3b95d93..23dd31229d7bd1379e356a423f9042bc0ea1cc35 100644 (file)
@@ -1358,7 +1358,7 @@ static void udev_check_rule_line(UdevRuleLine *line) {
         udev_check_conflicts_duplicates(line);
 }
 
-int udev_rules_parse_file(UdevRules *rules, const char *filename, UdevRuleFile **ret) {
+int udev_rules_parse_file(UdevRules *rules, const char *filename, bool extra_checks, UdevRuleFile **ret) {
         _cleanup_(udev_rule_file_freep) UdevRuleFile *rule_file = NULL;
         _cleanup_free_ char *continuation = NULL, *name = NULL;
         _cleanup_fclose_ FILE *f = NULL;
@@ -1469,6 +1469,10 @@ int udev_rules_parse_file(UdevRules *rules, const char *filename, UdevRuleFile *
 
         rule_resolve_goto(rule_file);
 
+        if (extra_checks)
+                LIST_FOREACH(rule_lines, line, rule_file->rule_lines)
+                        udev_check_rule_line(line);
+
         if (ret)
                 *ret = rule_file;
 
@@ -1479,9 +1483,6 @@ int udev_rules_parse_file(UdevRules *rules, const char *filename, UdevRuleFile *
 unsigned udev_rule_file_get_issues(UdevRuleFile *rule_file) {
         assert(rule_file);
 
-        LIST_FOREACH(rule_lines, line, rule_file->rule_lines)
-                udev_check_rule_line(line);
-
         return rule_file->issues;
 }
 
@@ -1513,7 +1514,7 @@ int udev_rules_load(UdevRules **ret_rules, ResolveNameTiming resolve_name_timing
                 return log_debug_errno(r, "Failed to enumerate rules files: %m");
 
         STRV_FOREACH(f, files) {
-                r = udev_rules_parse_file(rules, *f, NULL);
+                r = udev_rules_parse_file(rules, *f, /* extra_checks = */ false, NULL);
                 if (r < 0)
                         log_debug_errno(r, "Failed to read rules file %s, ignoring: %m", *f);
         }
index cecc285b2ccdbaba6b43a1c5905d70d993d44421..9b477fb235909f89fc9a350276b3b526c81f7374 100644 (file)
@@ -18,7 +18,7 @@ typedef enum {
         _ESCAPE_TYPE_INVALID = -EINVAL,
 } UdevRuleEscapeType;
 
-int udev_rules_parse_file(UdevRules *rules, const char *filename, UdevRuleFile **ret);
+int udev_rules_parse_file(UdevRules *rules, const char *filename, bool extra_checks, UdevRuleFile **ret);
 unsigned udev_rule_file_get_issues(UdevRuleFile *rule_file);
 UdevRules* udev_rules_new(ResolveNameTiming resolve_name_timing);
 int udev_rules_load(UdevRules **ret_rules, ResolveNameTiming resolve_name_timing);
index 2e947ef83016842dbc3c0b5450d975b49f41ed63..48aeb8f7e75daa8f2e9424b56e754b2cd7bf40b1 100644 (file)
@@ -104,7 +104,7 @@ static int verify_rules_file(UdevRules *rules, const char *fname) {
         UdevRuleFile *file;
         int r;
 
-        r = udev_rules_parse_file(rules, fname, &file);
+        r = udev_rules_parse_file(rules, fname, /* extra_checks = */ true, &file);
         if (r < 0)
                 return log_error_errno(r, "Failed to parse rules file %s: %m", fname);
         if (r == 0) /* empty file. */