]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: use parse_fd()
authorDavid Tardon <dtardon@redhat.com>
Fri, 5 May 2023 07:10:49 +0000 (09:10 +0200)
committerDavid Tardon <dtardon@redhat.com>
Fri, 5 May 2023 07:10:56 +0000 (09:10 +0200)
src/basic/fd-util.c
src/core/automount.c
src/core/dynamic-user.c
src/core/execute.c
src/core/main.c
src/core/manager-serialize.c
src/core/service.c
src/core/unit-serialize.c
src/notify/notify.c
src/shared/bpf-program.c
src/shared/varlink.c

index 974a7aac655725d5ebfd95d0016570729a0178ea..907bfeb60024b9d4252ee1506a9f0e9039146cb3 100644 (file)
@@ -416,7 +416,8 @@ int close_all_fds(const int except[], size_t n_except) {
                 if (!IN_SET(de->d_type, DT_LNK, DT_UNKNOWN))
                         continue;
 
-                if (safe_atoi(de->d_name, &fd) < 0)
+                fd = parse_fd(de->d_name);
+                if (fd < 0)
                         /* Let's better ignore this, just in case */
                         continue;
 
index 4cffca419cc48039ecd7244827911d0e3162132b..89755e3a9b354320679aa3c550317993d3e626b4 100644 (file)
@@ -938,7 +938,7 @@ static int automount_deserialize_item(Unit *u, const char *key, const char *valu
         } else if (streq(key, "pipe-fd")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse pipe-fd value: %s", value);
                 else {
                         safe_close(a->pipe_fd);
index 19cf3faca6c6ef664961bccea69e658b042c2a94..e99a6694f6f6f34ca65798614fb03b9677d0c18d 100644 (file)
@@ -645,12 +645,12 @@ void dynamic_user_deserialize_one(Manager *m, const char *value, FDSet *fds) {
                 return;
         }
 
-        if (safe_atoi(s0, &fd0) < 0 || !fdset_contains(fds, fd0)) {
+        if ((fd0 = parse_fd(s0)) < 0 || !fdset_contains(fds, fd0)) {
                 log_debug("Unable to process dynamic user fd specification.");
                 return;
         }
 
-        if (safe_atoi(s1, &fd1) < 0 || !fdset_contains(fds, fd1)) {
+        if ((fd1 = parse_fd(s1)) < 0 || !fdset_contains(fds, fd1)) {
                 log_debug("Unable to process dynamic user fd specification.");
                 return;
         }
index 04dcf4b42746966f212ae08501a124bd8591ac56..8ddd7362a3eef06abde0e2e4c42cd596918425a5 100644 (file)
@@ -7338,7 +7338,7 @@ int exec_shared_runtime_deserialize_compat(Unit *u, const char *key, const char
         } else if (streq(key, "netns-socket-0")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) {
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd)) {
                         log_unit_debug(u, "Failed to parse netns socket value: %s", value);
                         return 0;
                 }
@@ -7349,7 +7349,7 @@ int exec_shared_runtime_deserialize_compat(Unit *u, const char *key, const char
         } else if (streq(key, "netns-socket-1")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) {
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd)) {
                         log_unit_debug(u, "Failed to parse netns socket value: %s", value);
                         return 0;
                 }
@@ -7422,9 +7422,9 @@ int exec_shared_runtime_deserialize_one(Manager *m, const char *value, FDSet *fd
                 n = strcspn(v, " ");
                 buf = strndupa_safe(v, n);
 
-                r = safe_atoi(buf, &netns_fdpair[0]);
-                if (r < 0)
-                        return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-0=%s: %m", buf);
+                netns_fdpair[0] = parse_fd(buf);
+                if (netns_fdpair[0] < 0)
+                        return log_debug_errno(netns_fdpair[0], "Unable to parse exec-runtime specification netns-socket-0=%s: %m", buf);
                 if (!fdset_contains(fds, netns_fdpair[0]))
                         return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
                                                "exec-runtime specification netns-socket-0= refers to unknown fd %d: %m", netns_fdpair[0]);
@@ -7441,9 +7441,9 @@ int exec_shared_runtime_deserialize_one(Manager *m, const char *value, FDSet *fd
                 n = strcspn(v, " ");
                 buf = strndupa_safe(v, n);
 
-                r = safe_atoi(buf, &netns_fdpair[1]);
-                if (r < 0)
-                        return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-1=%s: %m", buf);
+                netns_fdpair[1] = parse_fd(buf);
+                if (netns_fdpair[1] < 0)
+                        return log_debug_errno(netns_fdpair[1], "Unable to parse exec-runtime specification netns-socket-1=%s: %m", buf);
                 if (!fdset_contains(fds, netns_fdpair[1]))
                         return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
                                                "exec-runtime specification netns-socket-1= refers to unknown fd %d: %m", netns_fdpair[1]);
@@ -7460,9 +7460,9 @@ int exec_shared_runtime_deserialize_one(Manager *m, const char *value, FDSet *fd
                 n = strcspn(v, " ");
                 buf = strndupa_safe(v, n);
 
-                r = safe_atoi(buf, &ipcns_fdpair[0]);
-                if (r < 0)
-                        return log_debug_errno(r, "Unable to parse exec-runtime specification ipcns-socket-0=%s: %m", buf);
+                ipcns_fdpair[0] = parse_fd(buf);
+                if (ipcns_fdpair[0] < 0)
+                        return log_debug_errno(ipcns_fdpair[0], "Unable to parse exec-runtime specification ipcns-socket-0=%s: %m", buf);
                 if (!fdset_contains(fds, ipcns_fdpair[0]))
                         return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
                                                "exec-runtime specification ipcns-socket-0= refers to unknown fd %d: %m", ipcns_fdpair[0]);
@@ -7479,9 +7479,9 @@ int exec_shared_runtime_deserialize_one(Manager *m, const char *value, FDSet *fd
                 n = strcspn(v, " ");
                 buf = strndupa_safe(v, n);
 
-                r = safe_atoi(buf, &ipcns_fdpair[1]);
-                if (r < 0)
-                        return log_debug_errno(r, "Unable to parse exec-runtime specification ipcns-socket-1=%s: %m", buf);
+                ipcns_fdpair[1] = parse_fd(buf);
+                if (ipcns_fdpair[1] < 0)
+                        return log_debug_errno(ipcns_fdpair[1], "Unable to parse exec-runtime specification ipcns-socket-1=%s: %m", buf);
                 if (!fdset_contains(fds, ipcns_fdpair[1]))
                         return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
                                                "exec-runtime specification ipcns-socket-1= refers to unknown fd %d: %m", ipcns_fdpair[1]);
index 0b2eb13d5e7435de9cd1fb90e9647f8c390e3aa7..ab545a6421dec6bce56fb28fd337f9623351f887 100644 (file)
@@ -1002,13 +1002,11 @@ static int parse_argv(int argc, char *argv[]) {
                         int fd;
                         FILE *f;
 
-                        r = safe_atoi(optarg, &fd);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse deserialize option \"%s\": %m", optarg);
+                        fd = parse_fd(optarg);
+                        if (fd == -ERANGE)
+                                return log_error_errno(fd, "Invalid deserialize fd: %s", optarg);
                         if (fd < 0)
-                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                                       "Invalid deserialize fd: %d",
-                                                       fd);
+                                return log_error_errno(fd, "Failed to parse deserialize option \"%s\": %m", optarg);
 
                         (void) fd_cloexec(fd, true);
 
index 270d95dd70f8f622d6bfac65a5e0ac0f09435868..4570f06b73111fef038c862ec9be592fb160f762 100644 (file)
@@ -476,7 +476,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                 } else if ((val = startswith(l, "notify-fd="))) {
                         int fd;
 
-                        if (safe_atoi(val, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                        if ((fd = parse_fd(val)) < 0 || !fdset_contains(fds, fd))
                                 log_notice("Failed to parse notify fd, ignoring: \"%s\"", val);
                         else {
                                 m->notify_event_source = sd_event_source_disable_unref(m->notify_event_source);
@@ -492,7 +492,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                 } else if ((val = startswith(l, "cgroups-agent-fd="))) {
                         int fd;
 
-                        if (safe_atoi(val, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                        if ((fd = parse_fd(val)) < 0 || !fdset_contains(fds, fd))
                                 log_notice("Failed to parse cgroups agent fd, ignoring.: %s", val);
                         else {
                                 m->cgroups_agent_event_source = sd_event_source_disable_unref(m->cgroups_agent_event_source);
index 2ba7511ad21d979907895db5376091798925e3e0..a7fd518feeb6d65af9e643dbdf2894eca77d6aa8 100644 (file)
@@ -3235,7 +3235,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
         } else if (streq(key, "socket-fd")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse socket-fd value: %s", value);
                 else {
                         asynchronous_close(s->socket_fd);
@@ -3246,7 +3246,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
                 int fd, do_poll;
 
                 r = extract_first_word(&value, &fdv, NULL, 0);
-                if (r <= 0 || safe_atoi(fdv, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) {
+                if (r <= 0 || (fd = parse_fd(fdv)) < 0 || !fdset_contains(fds, fd)) {
                         log_unit_debug(u, "Failed to parse fd-store-fd value: %s", value);
                         return 0;
                 }
@@ -3324,7 +3324,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
         } else if (streq(key, "stdin-fd")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse stdin-fd value: %s", value);
                 else {
                         asynchronous_close(s->stdin_fd);
@@ -3334,7 +3334,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
         } else if (streq(key, "stdout-fd")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse stdout-fd value: %s", value);
                 else {
                         asynchronous_close(s->stdout_fd);
@@ -3344,7 +3344,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
         } else if (streq(key, "stderr-fd")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse stderr-fd value: %s", value);
                 else {
                         asynchronous_close(s->stderr_fd);
@@ -3354,7 +3354,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
         } else if (streq(key, "exec-fd")) {
                 int fd;
 
-                if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                if ((fd = parse_fd(value)) < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse exec-fd value: %s", value);
                 else {
                         s->exec_fd_event_source = sd_event_source_disable_unref(s->exec_fd_event_source);
index 8055d9e5335254bc187f7cad961c84ba67996b21..cb209c5bde8ee64fbf63815579fdda97682c3fdf 100644 (file)
@@ -391,7 +391,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
                 else if (STR_IN_SET(l, "ipv4-socket-bind-bpf-link-fd", "ipv6-socket-bind-bpf-link-fd")) {
                         int fd;
 
-                        if (safe_atoi(v, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                        if ((fd = parse_fd(v)) < 0 || !fdset_contains(fds, fd))
                                 log_unit_debug(u, "Failed to parse %s value: %s, ignoring.", l, v);
                         else {
                                 if (fdset_remove(fds, fd) < 0) {
@@ -423,7 +423,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
                 } else if (streq(l, "restrict-ifaces-bpf-fd")) {
                         int fd;
 
-                        if (safe_atoi(v, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) {
+                        if ((fd = parse_fd(v)) < 0 || !fdset_contains(fds, fd)) {
                                 log_unit_debug(u, "Failed to parse restrict-ifaces-bpf-fd value: %s", v);
                                 continue;
                         }
index 8a551a9399cf2c4a2f1b54c1005385f19e1e8322..8d8e6db072d77b9c516c504ce1479d6df6133ce6 100644 (file)
@@ -215,11 +215,11 @@ static int parse_argv(int argc, char *argv[]) {
                         _cleanup_close_ int owned_fd = -EBADF;
                         int fdnr;
 
-                        r = safe_atoi(optarg, &fdnr);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse file descriptor: %s", optarg);
+                        fdnr = parse_fd(optarg);
+                        if (fdnr == -ERANGE)
+                                return log_error_errno(fdnr, "File descriptor can't be negative: %s", optarg);
                         if (fdnr < 0)
-                                return log_error_errno(SYNTHETIC_ERRNO(ERANGE), "File descriptor can't be negative: %i", fdnr);
+                                return log_error_errno(fdnr, "Failed to parse file descriptor: %s", optarg);
 
                         if (!passed) {
                                 /* Take possession of all passed fds */
index f4bb7f390c2eaa4220cd4076ba5adb7f985597ec..d924a973ec80818b011de454fdd707a860e1b3cb 100644 (file)
@@ -449,11 +449,11 @@ int bpf_program_deserialize_attachment(const char *v, FDSet *fds, BPFProgram **b
         if (r == 0)
                 return -EINVAL;
 
-        r = safe_atoi(sfd, &ifd);
-        if (r < 0)
-                return r;
-        if (ifd < 0)
+        ifd = parse_fd(sfd);
+        if (ifd == -ERANGE)
                 return -EBADF;
+        if (ifd < 0)
+                return r;
 
         /* Extract second word: the attach type */
         r = extract_first_word(&v, &sat, NULL, 0);
index 808e2b2dbabf942c6fda0cf073056841e140d6f8..a4936bff266927891c7944692e723b1d388d4005 100644 (file)
@@ -3060,12 +3060,12 @@ int varlink_server_deserialize_one(VarlinkServer *s, const char *value, FDSet *f
         n = strcspn(v, " ");
         buf = strndupa_safe(v, n);
 
-        r = safe_atoi(buf, &fd);
-        if (r < 0)
-                return log_debug_errno(r, "Unable to parse VarlinkServerSocket varlink-server-socket-fd=%s: %m", buf);
-        if (fd < 0)
+        fd = parse_fd(buf);
+        if (fd == -ERANGE)
                 return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
-                                       "VarlinkServerSocket varlink-server-socket-fd= has an invalid value: %d", fd);
+                                       "VarlinkServerSocket varlink-server-socket-fd= has an invalid value: %s", buf);
+        if (fd < 0)
+                return log_debug_errno(fd, "Unable to parse VarlinkServerSocket varlink-server-socket-fd=%s: %m", buf);
         if (!fdset_contains(fds, fd))
                 return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
                                        "VarlinkServerSocket varlink-server-socket-fd= has unknown fd %d: %m", fd);