]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: make udev_rules_new() return a proper error code
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 14 Dec 2018 09:20:43 +0000 (10:20 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 14 Dec 2018 09:20:43 +0000 (10:20 +0100)
src/fuzz/fuzz-udev-rules.c
src/test/test-udev.c
src/udev/udev-rules.c
src/udev/udev.h
src/udev/udevadm-test.c
src/udev/udevd.c

index dbdcda329e422d22110b711f9a2af4131b203288..42f0fa0b9106e3b2d012173b4fa2e4db2f122442 100644 (file)
@@ -99,9 +99,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size != 0)
                 assert_se(fwrite(data, size, 1, f) == 1);
         assert_se(fclose(f) == 0);
-        rules = udev_rules_new(RESOLVE_NAME_EARLY);
 
-        assert_se(cleanup_fake_filesystems(runtime_dir) >= 0);
+        assert_se(udev_rules_new(&rules, RESOLVE_NAME_EARLY) == 0);
 
+        assert_se(cleanup_fake_filesystems(runtime_dir) >= 0);
         return 0;
 }
index 281dbb51f29cd1dccab3ac040a6335b43ca78004..9165fad73a9690a4b34e0300062942d05f2eef85 100644 (file)
@@ -87,7 +87,7 @@ static int run(int argc, char *argv[]) {
         action = argv[1];
         devpath = argv[2];
 
-        rules = udev_rules_new(RESOLVE_NAME_EARLY);
+        assert_se(udev_rules_new(&rules, RESOLVE_NAME_EARLY) == 0);
 
         const char *syspath = strjoina("/sys", devpath);
         r = device_new_from_synthetic_event(&dev, syspath, action);
index a9fa04dbf043c2c23f5a29299344035202bb9ee8..4e516d7fc7c552fdcb8e4c580d42413d0efaa0dc 100644 (file)
@@ -1512,17 +1512,17 @@ static int parse_file(struct udev_rules *rules, const char *filename) {
         return 0;
 }
 
-struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing) {
-        struct udev_rules *rules;
-        struct token end_token;
-        char **files, **f;
+int udev_rules_new(struct udev_rules **ret_rules, ResolveNameTiming resolve_name_timing) {
+        _cleanup_(udev_rules_freep) struct udev_rules *rules = NULL;
+        _cleanup_strv_free_ char **files = NULL;
+        char **f;
         int r;
 
         assert(resolve_name_timing >= 0 && resolve_name_timing < _RESOLVE_NAME_TIMING_MAX);
 
         rules = new(struct udev_rules, 1);
         if (!rules)
-                return NULL;
+                return -ENOMEM;
 
         *rules = (struct udev_rules) {
                 .resolve_name_timing = resolve_name_timing,
@@ -1531,20 +1531,18 @@ struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing) {
         /* init token array and string buffer */
         rules->tokens = malloc_multiply(PREALLOC_TOKEN, sizeof(struct token));
         if (!rules->tokens)
-                return udev_rules_free(rules);
+                return -ENOMEM;
         rules->token_max = PREALLOC_TOKEN;
 
         rules->strbuf = strbuf_new();
         if (!rules->strbuf)
-                return udev_rules_free(rules);
+                return -ENOMEM;
 
         udev_rules_check_timestamp(rules);
 
         r = conf_files_list_strv(&files, ".rules", NULL, 0, rules_dirs);
-        if (r < 0) {
-                log_error_errno(r, "Failed to enumerate rules files: %m");
-                return udev_rules_free(rules);
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to enumerate rules files: %m");
 
         /*
          * The offset value in the rules strct is limited; add all
@@ -1556,10 +1554,7 @@ struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing) {
         STRV_FOREACH(f, files)
                 parse_file(rules, *f);
 
-        strv_free(files);
-
-        memzero(&end_token, sizeof(struct token));
-        end_token.type = TK_END;
+        struct token end_token = { .type = TK_END };
         add_token(rules, &end_token);
         log_debug("Rules contain %zu bytes tokens (%u * %zu bytes), %zu bytes strings",
                   rules->token_max * sizeof(struct token), rules->token_max, sizeof(struct token), rules->strbuf->len);
@@ -1579,7 +1574,8 @@ struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing) {
         rules->gids_max = 0;
 
         dump_rules(rules);
-        return rules;
+        *ret_rules = TAKE_PTR(rules);
+        return 0;
 }
 
 struct udev_rules *udev_rules_free(struct udev_rules *rules) {
index 27b335fd44c56d90473a518de61be4a12e96ed04..67e05e132f5bca8449e1ca72769632cdc21743e6 100644 (file)
@@ -47,8 +47,9 @@ struct udev_event {
 
 /* udev-rules.c */
 struct udev_rules;
-struct udev_rules *udev_rules_new(ResolveNameTiming resolve_name_timing);
+int udev_rules_new(struct udev_rules **ret_rules, ResolveNameTiming resolve_name_timing);
 struct udev_rules *udev_rules_free(struct udev_rules *rules);
+
 bool udev_rules_check_timestamp(struct udev_rules *rules);
 int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event,
                               usec_t timeout_usec,
index 005553cbb6724abd244b4041407620904b9e614e..d649525dd3ea4a4d5c1e2e82e3a2cdf1c8419ff1 100644 (file)
@@ -110,10 +110,9 @@ int test_main(int argc, char *argv[], void *userdata) {
 
         udev_builtin_init();
 
-        rules = udev_rules_new(arg_resolve_name_timing);
-        if (!rules) {
-                log_error("Failed to read udev rules.");
-                r = -ENOMEM;
+        r = udev_rules_new(&rules, arg_resolve_name_timing);
+        if (r < 0) {
+                log_error_errno(r, "Failed to read udev rules: %m");
                 goto out;
         }
 
index fa85f6e2632dc10f74bb15c922d2c3c2901ca4fe..44973a34b61ecd37f3acc208a285146379d4ca2c 100644 (file)
@@ -890,9 +890,11 @@ static void event_queue_start(Manager *manager) {
         udev_builtin_init();
 
         if (!manager->rules) {
-                manager->rules = udev_rules_new(arg_resolve_name_timing);
-                if (!manager->rules)
+                r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
+                if (r < 0) {
+                        log_warning_errno(r, "Failed to read udev rules: %m");
                         return;
+                }
         }
 
         LIST_FOREACH(event, event, manager->events) {
@@ -1608,9 +1610,9 @@ static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cg
 
         udev_builtin_init();
 
-        manager->rules = udev_rules_new(arg_resolve_name_timing);
+        r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
         if (!manager->rules)
-                return log_error_errno(SYNTHETIC_ERRNO(ENOMEM), "Failed to read udev rules");
+                return log_error_errno(r, "Failed to read udev rules: %m");
 
         manager->ctrl = udev_ctrl_new_from_fd(fd_ctrl);
         if (!manager->ctrl)