From 4529ad1defde79e74797b494ab3ac924ce06ff2a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 18 Mar 2014 19:22:43 +0100 Subject: [PATCH] util: replace close_nointr_nofail() by a more useful safe_close() safe_close() automatically becomes a NOP when a negative fd is passed, and returns -1 unconditionally. This makes it easy to write lines like this: fd = safe_close(fd); Which will close an fd if it is open, and reset the fd variable correctly. By making use of this new scheme we can drop a > 200 lines of code that was required to test for non-negative fds or to reset the closed fd variable afterwards. (cherry-picked from commit 03e334a1c7dc8c20c38902aa039440763acc9b17) --- src/core/audit-fd.c | 2 +- src/core/automount.c | 41 +++------- src/core/busname.c | 14 +--- src/core/cgroup.c | 8 +- src/core/dbus.c | 5 +- src/core/execute.c | 58 +++++--------- src/core/ima-setup.c | 6 +- src/core/load-fragment.c | 2 +- src/core/machine-id-setup.c | 7 +- src/core/main.c | 2 +- src/core/manager.c | 32 +++----- src/core/path.c | 6 +- src/core/service.c | 6 +- src/core/smack-setup.c | 2 +- src/core/socket.c | 44 ++++------- src/core/switch-root.c | 35 +++------ src/core/umount.c | 8 +- src/fsck/fsck.c | 9 +-- src/initctl/initctl.c | 5 +- src/journal/cat.c | 9 +-- src/journal/catalog.c | 8 +- src/journal/coredumpctl.c | 3 +- src/journal/journal-authenticate.c | 5 +- src/journal/journal-file.c | 4 +- src/journal/journal-send.c | 14 ++-- src/journal/journal-verify.c | 12 +-- src/journal/journalctl.c | 5 +- src/journal/journald-console.c | 2 +- src/journal/journald-kmsg.c | 14 +--- src/journal/journald-server.c | 22 ++---- src/journal/journald-stream.c | 7 +- src/journal/sd-journal.c | 3 +- src/journal/test-journal-verify.c | 2 +- src/journal/test-mmap-cache.c | 6 +- src/libsystemd-dhcp/dhcp-network.c | 4 +- src/libsystemd-dhcp/sd-dhcp-client.c | 15 +--- src/libsystemd/sd-bus/bus-container.c | 6 +- src/libsystemd/sd-bus/bus-kernel.c | 26 +++---- src/libsystemd/sd-bus/bus-message.c | 4 +- src/libsystemd/sd-bus/bus-socket.c | 4 +- src/libsystemd/sd-bus/sd-bus.c | 4 +- src/libsystemd/sd-bus/sd-memfd.c | 4 +- src/libsystemd/sd-bus/test-bus-chat.c | 2 +- .../sd-bus/test-bus-kernel-benchmark.c | 2 +- src/libsystemd/sd-bus/test-bus-kernel.c | 6 +- src/libsystemd/sd-event/sd-event.c | 31 +++----- src/libsystemd/sd-resolve/sd-resolve.c | 3 +- src/libsystemd/sd-rtnl/sd-rtnl.c | 4 +- src/login/logind-button.c | 2 +- src/login/logind-core.c | 2 +- src/login/logind-inhibit.c | 12 +-- src/login/logind-session.c | 18 ++--- src/login/logind.c | 6 +- src/login/pam-module.c | 2 +- src/login/sd-login.c | 8 +- src/login/test-inhibit.c | 4 +- src/machine/machinectl.c | 6 +- src/nspawn/nspawn.c | 19 ++--- src/readahead/readahead-collect.c | 22 ++---- src/readahead/readahead-common.c | 2 +- src/readahead/readahead-replay.c | 18 ++--- src/reply-password/reply-password.c | 6 +- src/shared/ask-password-api.c | 17 ++--- src/shared/fdset.c | 2 +- src/shared/install.c | 12 +-- src/shared/log.c | 25 ++---- src/shared/logs-show.c | 8 +- src/shared/spawn-polkit-agent.c | 4 +- src/shared/util.c | 76 +++++++++---------- src/shared/util.h | 6 +- src/shared/watchdog.c | 3 +- src/shutdownd/shutdownd.c | 3 +- src/socket-proxy/socket-proxyd.c | 16 ++-- src/test/test-util.c | 2 +- src/tmpfiles/tmpfiles.c | 6 +- .../tty-ask-password-agent.c | 25 ++---- src/udev/net/link-config.c | 3 +- src/vconsole/vconsole-setup.c | 3 +- 78 files changed, 311 insertions(+), 550 deletions(-) diff --git a/src/core/audit-fd.c b/src/core/audit-fd.c index 5955bd846..4326d1736 100644 --- a/src/core/audit-fd.c +++ b/src/core/audit-fd.c @@ -55,7 +55,7 @@ int get_audit_fd(void) { void close_audit_fd(void) { if (initialized && audit_fd >= 0) - close_nointr_nofail(audit_fd); + safe_close(audit_fd); initialized = true; audit_fd = -ECONNRESET; diff --git a/src/core/automount.c b/src/core/automount.c index 889b20e25..77d80b278 100644 --- a/src/core/automount.c +++ b/src/core/automount.c @@ -90,9 +90,7 @@ static void unmount_autofs(Automount *a) { automount_send_ready(a, -EHOSTDOWN); a->pipe_event_source = sd_event_source_unref(a->pipe_event_source); - - close_nointr_nofail(a->pipe_fd); - a->pipe_fd = -1; + a->pipe_fd = safe_close(a->pipe_fd); /* If we reload/reexecute things we keep the mount point * around */ @@ -310,8 +308,7 @@ static int open_dev_autofs(Manager *m) { init_autofs_dev_ioctl(¶m); if (ioctl(m->dev_autofs_fd, AUTOFS_DEV_IOCTL_VERSION, ¶m) < 0) { - close_nointr_nofail(m->dev_autofs_fd); - m->dev_autofs_fd = -1; + m->dev_autofs_fd = safe_close(m->dev_autofs_fd); return -errno; } @@ -411,8 +408,9 @@ static int autofs_send_ready(int dev_autofs_fd, int ioctl_fd, uint32_t token, in } int automount_send_ready(Automount *a, int status) { - int ioctl_fd, r; + _cleanup_close_ int ioctl_fd = -1; unsigned token; + int r; assert(a); assert(status <= 0); @@ -421,10 +419,8 @@ int automount_send_ready(Automount *a, int status) { return 0; ioctl_fd = open_ioctl_fd(UNIT(a)->manager->dev_autofs_fd, a->where, a->dev_id); - if (ioctl_fd < 0) { - r = ioctl_fd; - goto fail; - } + if (ioctl_fd < 0) + return ioctl_fd; if (status) log_debug_unit(UNIT(a)->id, "Sending failure: %s", strerror(-status)); @@ -450,18 +446,15 @@ int automount_send_ready(Automount *a, int status) { r = k; } -fail: - if (ioctl_fd >= 0) - close_nointr_nofail(ioctl_fd); - return r; } static void automount_enter_waiting(Automount *a) { + _cleanup_close_ int ioctl_fd = -1; int p[2] = { -1, -1 }; char name[32], options[128]; bool mounted = false; - int r, ioctl_fd = -1, dev_autofs_fd; + int r, dev_autofs_fd; struct stat st; assert(a); @@ -500,8 +493,7 @@ static void automount_enter_waiting(Automount *a) { mounted = true; - close_nointr_nofail(p[1]); - p[1] = -1; + p[1] = safe_close(p[1]); if (stat(a->where, &st) < 0) { r = -errno; @@ -528,9 +520,6 @@ static void automount_enter_waiting(Automount *a) { * the direct mount will not receive events from the * kernel. */ - close_nointr_nofail(ioctl_fd); - ioctl_fd = -1; - r = sd_event_add_io(UNIT(a)->manager->event, &a->pipe_event_source, p[0], EPOLLIN, automount_dispatch_io, a); if (r < 0) goto fail; @@ -543,10 +532,7 @@ static void automount_enter_waiting(Automount *a) { return; fail: - assert_se(close_pipe(p) == 0); - - if (ioctl_fd >= 0) - close_nointr_nofail(ioctl_fd); + close_pipe(p); if (mounted) repeat_unmount(a->where); @@ -713,9 +699,7 @@ static int automount_deserialize_item(Unit *u, const char *key, const char *valu if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) log_debug_unit(u->id, "Failed to parse pipe-fd value %s", value); else { - if (a->pipe_fd >= 0) - close_nointr_nofail(a->pipe_fd); - + safe_close(a->pipe_fd); a->pipe_fd = fdset_remove(fds, fd); } } else @@ -809,8 +793,7 @@ fail: static void automount_shutdown(Manager *m) { assert(m); - if (m->dev_autofs_fd >= 0) - close_nointr_nofail(m->dev_autofs_fd); + m->dev_autofs_fd = safe_close(m->dev_autofs_fd); } static void automount_reset_failed(Unit *u) { diff --git a/src/core/busname.c b/src/core/busname.c index bca214502..69d6e8083 100644 --- a/src/core/busname.c +++ b/src/core/busname.c @@ -56,11 +56,7 @@ static void busname_done(Unit *u) { unit_ref_unset(&n->service); n->event_source = sd_event_source_unref(n->event_source); - - if (n->starter_fd >= 0) { - close_nointr_nofail(n->starter_fd); - n->starter_fd = -1; - } + n->starter_fd = safe_close(n->starter_fd); } static int busname_add_default_default_dependencies(BusName *n) { @@ -122,8 +118,6 @@ static int busname_add_extras(BusName *n) { return 0; } - - static int busname_verify(BusName *n) { char *e; @@ -202,8 +196,7 @@ static void busname_close_fd(BusName *n) { if (n->starter_fd <= 0) return; - close_nointr_nofail(n->starter_fd); - n->starter_fd = -1; + n->starter_fd = safe_close(n->starter_fd); } static int busname_watch_fd(BusName *n) { @@ -453,8 +446,7 @@ static int busname_deserialize_item(Unit *u, const char *key, const char *value, if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) log_debug_unit(u->id, "Failed to parse starter fd value %s", value); else { - if (n->starter_fd >= 0) - close_nointr_nofail(n->starter_fd); + safe_close(n->starter_fd); n->starter_fd = fdset_remove(fds, fd); } } else diff --git a/src/core/cgroup.c b/src/core/cgroup.c index e762bbfed..5c9ef02eb 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -860,8 +860,7 @@ int manager_setup_cgroup(Manager *m) { } /* 5. And pin it, so that it cannot be unmounted */ - if (m->pin_cgroupfs_fd >= 0) - close_nointr_nofail(m->pin_cgroupfs_fd); + safe_close(m->pin_cgroupfs_fd); m->pin_cgroupfs_fd = open(path, O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY|O_NONBLOCK); if (m->pin_cgroupfs_fd < 0) { @@ -886,10 +885,7 @@ void manager_shutdown_cgroup(Manager *m, bool delete) { if (delete && m->cgroup_root) cg_trim(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_root, false); - if (m->pin_cgroupfs_fd >= 0) { - close_nointr_nofail(m->pin_cgroupfs_fd); - m->pin_cgroupfs_fd = -1; - } + m->pin_cgroupfs_fd = safe_close(m->pin_cgroupfs_fd); free(m->cgroup_root); m->cgroup_root = NULL; diff --git a/src/core/dbus.c b/src/core/dbus.c index 105941571..fe1c6e965 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -1080,10 +1080,7 @@ void bus_done(Manager *m) { if (m->private_listen_event_source) m->private_listen_event_source = sd_event_source_unref(m->private_listen_event_source); - if (m->private_listen_fd >= 0) { - close_nointr_nofail(m->private_listen_fd); - m->private_listen_fd = -1; - } + m->private_listen_fd = safe_close(m->private_listen_fd); } int bus_fdset_add_all(Manager *m, FDSet *fds) { diff --git a/src/core/execute.c b/src/core/execute.c index bb06507ad..a5fe0c994 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -121,7 +121,7 @@ static int shift_fds(int fds[], unsigned n_fds) { if ((nfd = fcntl(fds[i], F_DUPFD, i+3)) < 0) return -errno; - close_nointr_nofail(fds[i]); + safe_close(fds[i]); fds[i] = nfd; /* Hmm, the fd we wanted isn't free? Then @@ -207,7 +207,7 @@ static int open_null_as(int flags, int nfd) { if (fd != nfd) { r = dup2(fd, nfd) < 0 ? -errno : nfd; - close_nointr_nofail(fd); + safe_close(fd); } else r = nfd; @@ -232,12 +232,12 @@ static int connect_logger_as(const ExecContext *context, ExecOutput output, cons r = connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)); if (r < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } if (shutdown(fd, SHUT_RD) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -261,7 +261,7 @@ static int connect_logger_as(const ExecContext *context, ExecOutput output, cons if (fd != nfd) { r = dup2(fd, nfd) < 0 ? -errno : nfd; - close_nointr_nofail(fd); + safe_close(fd); } else r = nfd; @@ -278,7 +278,7 @@ static int open_terminal_as(const char *path, mode_t mode, int nfd) { if (fd != nfd) { r = dup2(fd, nfd) < 0 ? -errno : nfd; - close_nointr_nofail(fd); + safe_close(fd); } else r = nfd; @@ -338,7 +338,7 @@ static int setup_input(const ExecContext *context, int socket_fd, bool apply_tty if (fd != STDIN_FILENO) { r = dup2(fd, STDIN_FILENO) < 0 ? -errno : STDIN_FILENO; - close_nointr_nofail(fd); + safe_close(fd); } else r = STDIN_FILENO; @@ -502,7 +502,7 @@ static int setup_confirm_stdio(int *_saved_stdin, } if (fd >= 2) - close_nointr_nofail(fd); + safe_close(fd); *_saved_stdin = saved_stdin; *_saved_stdout = saved_stdout; @@ -510,20 +510,15 @@ static int setup_confirm_stdio(int *_saved_stdin, return 0; fail: - if (saved_stdout >= 0) - close_nointr_nofail(saved_stdout); - - if (saved_stdin >= 0) - close_nointr_nofail(saved_stdin); - - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(saved_stdout); + safe_close(saved_stdin); + safe_close(fd); return r; } _printf_(1, 2) static int write_confirm_message(const char *format, ...) { - int fd; + _cleanup_close_ int fd = -1; va_list ap; assert(format); @@ -536,8 +531,6 @@ _printf_(1, 2) static int write_confirm_message(const char *format, ...) { vdprintf(fd, format, ap); va_end(ap); - close_nointr_nofail(fd); - return 0; } @@ -559,11 +552,8 @@ static int restore_confirm_stdio(int *saved_stdin, if (dup2(*saved_stdout, STDOUT_FILENO) < 0) r = -errno; - if (*saved_stdin >= 0) - close_nointr_nofail(*saved_stdin); - - if (*saved_stdout >= 0) - close_nointr_nofail(*saved_stdout); + safe_close(*saved_stdin); + safe_close(*saved_stdout); return r; } @@ -1002,10 +992,9 @@ static int apply_seccomp(ExecContext *c) { static void do_idle_pipe_dance(int idle_pipe[4]) { assert(idle_pipe); - if (idle_pipe[1] >= 0) - close_nointr_nofail(idle_pipe[1]); - if (idle_pipe[2] >= 0) - close_nointr_nofail(idle_pipe[2]); + + safe_close(idle_pipe[1]); + safe_close(idle_pipe[2]); if (idle_pipe[0] >= 0) { int r; @@ -1020,12 +1009,11 @@ static void do_idle_pipe_dance(int idle_pipe[4]) { fd_wait_for_event(idle_pipe[0], POLLHUP, IDLE_TIMEOUT2_USEC); } - close_nointr_nofail(idle_pipe[0]); + safe_close(idle_pipe[0]); } - if (idle_pipe[3] >= 0) - close_nointr_nofail(idle_pipe[3]); + safe_close(idle_pipe[3]); } static int build_environment( @@ -2545,9 +2533,7 @@ int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, co if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) log_debug_unit(u->id, "Failed to parse netns socket value %s", value); else { - if ((*rt)->netns_storage_socket[0] >= 0) - close_nointr_nofail((*rt)->netns_storage_socket[0]); - + safe_close((*rt)->netns_storage_socket[0]); (*rt)->netns_storage_socket[0] = fdset_remove(fds, fd); } } else if (streq(key, "netns-socket-1")) { @@ -2560,9 +2546,7 @@ int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, co if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) log_debug_unit(u->id, "Failed to parse netns socket value %s", value); else { - if ((*rt)->netns_storage_socket[1] >= 0) - close_nointr_nofail((*rt)->netns_storage_socket[1]); - + safe_close((*rt)->netns_storage_socket[1]); (*rt)->netns_storage_socket[1] = fdset_remove(fds, fd); } } else diff --git a/src/core/ima-setup.c b/src/core/ima-setup.c index 7f8ec23d5..ed65096f0 100644 --- a/src/core/ima-setup.c +++ b/src/core/ima-setup.c @@ -47,7 +47,7 @@ int ima_setup(void) { struct stat st; ssize_t policy_size = 0, written = 0; char *policy; - int policyfd = -1, imafd = -1; + _cleanup_close_ int policyfd = -1, imafd = -1; int result = 0; if (stat(IMA_POLICY_PATH, &st) < 0) @@ -98,10 +98,6 @@ int ima_setup(void) { out_mmap: munmap(policy, policy_size); out: - if (policyfd >= 0) - close_nointr_nofail(policyfd); - if (imafd >= 0) - close_nointr_nofail(imafd); if (result) return result; #endif /* HAVE_IMA */ diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 027ec5faa..2129eba16 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -2701,7 +2701,7 @@ static int open_follow(char **filename, FILE **_f, Set *names, char **_final) { f = fdopen(fd, "re"); if (!f) { r = -errno; - close_nointr_nofail(fd); + safe_close(fd); return r; } diff --git a/src/core/machine-id-setup.c b/src/core/machine-id-setup.c index 602be3be1..e3f7d3fba 100644 --- a/src/core/machine-id-setup.c +++ b/src/core/machine-id-setup.c @@ -73,7 +73,7 @@ static int generate(char id[34]) { fd = open("/var/lib/dbus/machine-id", O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW); if (fd >= 0) { k = loop_read(fd, id, 33, false); - close_nointr_nofail(fd); + safe_close(fd); if (k == 33 && id[32] == '\n') { @@ -118,7 +118,7 @@ static int generate(char id[34]) { fd = open("/sys/class/dmi/id/product_uuid", O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW); if (fd >= 0) { k = loop_read(fd, uuid, 36, false); - close_nointr_nofail(fd); + safe_close(fd); if (k >= 36) { r = shorten_uuid(id, uuid); @@ -205,8 +205,7 @@ int machine_id_setup(void) { return 0; } - close_nointr_nofail(fd); - fd = -1; + fd = safe_close(fd); /* Hmm, we couldn't write it? So let's write it to * /run/machine-id as a replacement */ diff --git a/src/core/main.c b/src/core/main.c index f3833643a..8417e7a2e 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -234,7 +234,7 @@ static int console_setup(bool do_reset) { if (r < 0) log_error("Failed to reset /dev/console: %s", strerror(-r)); - close_nointr_nofail(tty_fd); + safe_close(tty_fd); return r; } diff --git a/src/core/manager.c b/src/core/manager.c index 5689e606b..2f9ea1fd9 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -248,8 +248,7 @@ static int manager_setup_time_change(Manager *m) { if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) { log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m"); - close_nointr_nofail(m->time_change_fd); - m->time_change_fd = -1; + m->time_change_fd = safe_close(m->time_change_fd); return 0; } @@ -785,14 +784,10 @@ void manager_free(Manager *m) { sd_event_source_unref(m->idle_pipe_event_source); sd_event_source_unref(m->run_queue_event_source); - if (m->signal_fd >= 0) - close_nointr_nofail(m->signal_fd); - if (m->notify_fd >= 0) - close_nointr_nofail(m->notify_fd); - if (m->time_change_fd >= 0) - close_nointr_nofail(m->time_change_fd); - if (m->kdbus_fd >= 0) - close_nointr_nofail(m->kdbus_fd); + safe_close(m->signal_fd); + safe_close(m->notify_fd); + safe_close(m->time_change_fd); + safe_close(m->kdbus_fd); manager_close_idle_pipe(m); @@ -1746,9 +1741,7 @@ static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint /* Restart the watch */ m->time_change_event_source = sd_event_source_unref(m->time_change_event_source); - - close_nointr_nofail(m->time_change_fd); - m->time_change_fd = -1; + m->time_change_fd = safe_close(m->time_change_fd); manager_setup_time_change(m); @@ -2032,7 +2025,7 @@ int manager_open_serialization(Manager *m, FILE **_f) { f = fdopen(fd, "w+"); if (!f) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -2253,11 +2246,8 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) log_debug("Failed to parse notify fd: %s", l + 10); else { - if (m->notify_fd >= 0) { - m->notify_event_source = sd_event_source_unref(m->notify_event_source); - close_nointr_nofail(m->notify_fd); - } - + m->notify_event_source = sd_event_source_unref(m->notify_event_source); + safe_close(m->notify_fd); m->notify_fd = fdset_remove(fds, fd); } @@ -2279,9 +2269,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) log_debug("Failed to parse kdbus fd: %s", l + 9); else { - if (m->kdbus_fd >= 0) - close_nointr_nofail(m->kdbus_fd); - + safe_close(m->kdbus_fd); m->kdbus_fd = fdset_remove(fds, fd); } diff --git a/src/core/path.c b/src/core/path.c index 1d6c6cc6c..6fea79118 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -152,11 +152,7 @@ void path_spec_unwatch(PathSpec *s) { assert(s); s->event_source = sd_event_source_unref(s->event_source); - - if (s->inotify_fd >= 0) { - close_nointr_nofail(s->inotify_fd); - s->inotify_fd = -1; - } + s->inotify_fd = safe_close(s->inotify_fd); } int path_spec_fd_event(PathSpec *s, uint32_t revents) { diff --git a/src/core/service.c b/src/core/service.c index 607988160..3c397987f 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -226,8 +226,7 @@ static void service_close_socket_fd(Service *s) { if (s->socket_fd < 0) return; - close_nointr_nofail(s->socket_fd); - s->socket_fd = -1; + s->socket_fd = safe_close(s->socket_fd); } static void service_connection_unref(Service *s) { @@ -2686,8 +2685,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value, log_debug_unit(u->id, "Failed to parse socket-fd value %s", value); else { - if (s->socket_fd >= 0) - close_nointr_nofail(s->socket_fd); + safe_close(s->socket_fd); s->socket_fd = fdset_remove(fds, fd); } } else if (streq(key, "main-exec-status-pid")) { diff --git a/src/core/smack-setup.c b/src/core/smack-setup.c index a68605c27..5f6dabf82 100644 --- a/src/core/smack-setup.c +++ b/src/core/smack-setup.c @@ -87,7 +87,7 @@ static int write_rules(const char* dstpath, const char* srcdir) { if (!policy) { if (r == 0) r = -errno; - close_nointr_nofail(fd); + safe_close(fd); log_error("Failed to open %s: %m", entry->d_name); continue; } diff --git a/src/core/socket.c b/src/core/socket.c index 0ccda2fe3..0c76d7fdc 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -119,9 +119,7 @@ void socket_free_ports(Socket *s) { sd_event_source_unref(p->event_source); - if (p->fd >= 0) - close_nointr_nofail(p->fd); - + safe_close(p->fd); free(p->path); free(p); } @@ -706,7 +704,7 @@ static void socket_close_fds(Socket *s) { if (p->fd < 0) continue; - close_nointr_nofail(p->fd); + p->fd = safe_close(p->fd); /* One little note: we should never delete any sockets * in the file system here! After all some other @@ -715,8 +713,6 @@ static void socket_close_fds(Socket *s) { * we delete sockets in the file system before we * create a new one, not after we stopped using * one! */ - - p->fd = -1; } } @@ -886,9 +882,7 @@ static int fifo_address_create( fail: label_context_clear(); - - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -923,8 +917,7 @@ static int special_address_create( return 0; fail: - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -983,9 +976,7 @@ static int mq_address_create( return 0; fail: - if (fd >= 0) - close_nointr_nofail(fd); - + safe_close(fd); return r; } @@ -1475,7 +1466,7 @@ static void socket_enter_running(Socket *s, int cfd) { log_debug_unit(UNIT(s)->id, "Suppressing connection request on %s since unit stop is scheduled.", UNIT(s)->id); if (cfd >= 0) - close_nointr_nofail(cfd); + safe_close(cfd); else { /* Flush all sockets by closing and reopening them */ socket_close_fds(s); @@ -1523,7 +1514,7 @@ static void socket_enter_running(Socket *s, int cfd) { if (s->n_connections >= s->max_connections) { log_warning_unit(UNIT(s)->id, "%s: Too many incoming connections (%u)", UNIT(s)->id, s->n_connections); - close_nointr_nofail(cfd); + safe_close(cfd); return; } @@ -1538,7 +1529,7 @@ static void socket_enter_running(Socket *s, int cfd) { /* ENOTCONN is legitimate if TCP RST was received. * This connection is over, but the socket unit lives on. */ - close_nointr_nofail(cfd); + safe_close(cfd); return; } @@ -1589,9 +1580,7 @@ fail: bus_error_message(&error, r)); socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES); - - if (cfd >= 0) - close_nointr_nofail(cfd); + safe_close(cfd); } static void socket_run_next(Socket *s) { @@ -1822,8 +1811,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1842,8 +1830,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1862,8 +1849,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1881,8 +1867,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1900,8 +1885,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } diff --git a/src/core/switch-root.c b/src/core/switch-root.c index ce0e41d51..518ec1f0a 100644 --- a/src/core/switch-root.c +++ b/src/core/switch-root.c @@ -41,11 +41,10 @@ int switch_root(const char *new_root) { "/sys\0" "/run\0"; - int r, old_root_fd = -1; + _cleanup_close_ int old_root_fd = -1; struct stat new_root_stat; bool old_root_remove; - const char *i; - _cleanup_free_ char *temporary_old_root = NULL; + const char *i, *temporary_old_root; if (path_equal(new_root, "/")) return 0; @@ -56,16 +55,13 @@ int switch_root(const char *new_root) { * directory we choose for this, but it should be more likely * than not that /mnt exists and is suitable as mount point * and is on the same fs as the old root dir */ - temporary_old_root = strappend(new_root, "/mnt"); - if (!temporary_old_root) - return -ENOMEM; + temporary_old_root = strappenda(new_root, "/mnt"); old_root_remove = in_initrd(); if (stat(new_root, &new_root_stat) < 0) { - r = -errno; log_error("Failed to stat directory %s: %m", new_root); - goto fail; + return -errno; } /* Work-around for a kernel bug: for some reason the kernel @@ -104,9 +100,8 @@ int switch_root(const char *new_root) { } if (chdir(new_root) < 0) { - r = -errno; log_error("Failed to change directory to %s: %m", new_root); - goto fail; + return -errno; } if (old_root_remove) { @@ -123,27 +118,23 @@ int switch_root(const char *new_root) { /* Immediately get rid of the old root. Since we are * running off it we need to do this lazily. */ if (umount2(temporary_old_root, MNT_DETACH) < 0) { - r = -errno; log_error("Failed to umount old root dir %s: %m", temporary_old_root); - goto fail; + return -errno; } } else if (mount(new_root, "/", NULL, MS_MOVE, NULL) < 0) { - r = -errno; log_error("Failed to mount moving %s to /: %m", new_root); - goto fail; + return -errno; } if (chroot(".") < 0) { - r = -errno; log_error("Failed to change root: %m"); - goto fail; + return -errno; } if (chdir("/") < 0) { - r = -errno; log_error("Failed to change directory: %m"); - goto fail; + return -errno; } if (old_root_fd >= 0) { @@ -157,11 +148,5 @@ int switch_root(const char *new_root) { } } - r = 0; - -fail: - if (old_root_fd >= 0) - close_nointr_nofail(old_root_fd); - - return r; + return 0; } diff --git a/src/core/umount.c b/src/core/umount.c index 2d166c1c9..d1258f0f0 100644 --- a/src/core/umount.c +++ b/src/core/umount.c @@ -329,14 +329,14 @@ static int dm_list_get(MountPoint **head) { } static int delete_loopback(const char *device) { - int fd, r; + _cleanup_close_ int fd = -1; + int r; - if ((fd = open(device, O_RDONLY|O_CLOEXEC)) < 0) + fd = open(device, O_RDONLY|O_CLOEXEC); + if (fd < 0) return errno == ENOENT ? 0 : -errno; r = ioctl(fd, LOOP_CLR_FD, 0); - close_nointr_nofail(fd); - if (r >= 0) return 1; diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index 4a5f6b17c..869ae929f 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -137,7 +137,7 @@ static int process_progress(int fd) { f = fdopen(fd, "r"); if (!f) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -324,15 +324,12 @@ int main(int argc, char *argv[]) { } else if (pid == 0) { /* Child */ if (progress_pipe[0] >= 0) - close_nointr_nofail(progress_pipe[0]); + safe_close(progress_pipe[0]); execv(cmdline[0], (char**) cmdline); _exit(8); /* Operational error */ } - if (progress_pipe[1] >= 0) { - close_nointr_nofail(progress_pipe[1]); - progress_pipe[1] = -1; - } + progress_pipe[1] = safe_close(progress_pipe[1]); if (progress_pipe[0] >= 0) { process_progress(progress_pipe[0]); diff --git a/src/initctl/initctl.c b/src/initctl/initctl.c index 468df35ba..f9613ea3b 100644 --- a/src/initctl/initctl.c +++ b/src/initctl/initctl.c @@ -245,7 +245,7 @@ static void fifo_free(Fifo *f) { if (f->server) epoll_ctl(f->server->epoll_fd, EPOLL_CTL_DEL, f->fd, NULL); - close_nointr_nofail(f->fd); + safe_close(f->fd); } free(f); @@ -257,8 +257,7 @@ static void server_done(Server *s) { while (s->fifos) fifo_free(s->fifos); - if (s->epoll_fd >= 0) - close_nointr_nofail(s->epoll_fd); + safe_close(s->epoll_fd); if (s->bus) { sd_bus_flush(s->bus); diff --git a/src/journal/cat.c b/src/journal/cat.c index 02b75642a..60625cb6d 100644 --- a/src/journal/cat.c +++ b/src/journal/cat.c @@ -152,7 +152,7 @@ int main(int argc, char *argv[]) { } if (fd >= 3) - close_nointr_nofail(fd); + safe_close(fd); fd = -1; @@ -170,11 +170,8 @@ int main(int argc, char *argv[]) { log_error("Failed to execute process: %s", strerror(-r)); finish: - if (fd >= 0) - close_nointr_nofail(fd); - - if (saved_stderr >= 0) - close_nointr_nofail(saved_stderr); + safe_close(fd); + safe_close(saved_stderr); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/src/journal/catalog.c b/src/journal/catalog.c index 469719a2c..f03357ded 100644 --- a/src/journal/catalog.c +++ b/src/journal/catalog.c @@ -485,18 +485,18 @@ static int open_mmap(const char *database, int *_fd, struct stat *_st, void **_p return -errno; if (fstat(fd, &st) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } if (st.st_size < (off_t) sizeof(CatalogHeader)) { - close_nointr_nofail(fd); + safe_close(fd); return -EINVAL; } p = mmap(NULL, PAGE_ALIGN(st.st_size), PROT_READ, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -507,7 +507,7 @@ static int open_mmap(const char *database, int *_fd, struct stat *_st, void **_p h->incompatible_flags != 0 || le64toh(h->n_items) <= 0 || st.st_size < (off_t) (le64toh(h->header_size) + le64toh(h->catalog_item_size) * le64toh(h->n_items))) { - close_nointr_nofail(fd); + safe_close(fd); munmap(p, st.st_size); return -EBADMSG; } diff --git a/src/journal/coredumpctl.c b/src/journal/coredumpctl.c index 3bceb48ff..bf943bc03 100644 --- a/src/journal/coredumpctl.c +++ b/src/journal/coredumpctl.c @@ -490,8 +490,7 @@ static int run_gdb(sd_journal *j) { goto finish; } - close_nointr_nofail(fd); - fd = -1; + fd = safe_close(fd); pid = fork(); if (pid < 0) { diff --git a/src/journal/journal-authenticate.c b/src/journal/journal-authenticate.c index f416b79a3..5ab1982bf 100644 --- a/src/journal/journal-authenticate.c +++ b/src/journal/journal-authenticate.c @@ -418,10 +418,9 @@ finish: if (m) munmap(m, PAGE_ALIGN(sizeof(FSSHeader))); - if (fd >= 0) - close_nointr_nofail(fd); - + safe_close(fd); free(p); + return r; } diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index c27289c9f..49d47cba2 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -133,9 +133,7 @@ void journal_file_close(JournalFile *f) { if (f->header) munmap(f->header, PAGE_ALIGN(sizeof(Header))); - if (f->fd >= 0) - close_nointr_nofail(f->fd); - + safe_close(f->fd); free(f->path); if (f->mmap) diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c index ca9199f71..d92e84baa 100644 --- a/src/journal/journal-send.c +++ b/src/journal/journal-send.c @@ -66,7 +66,7 @@ retry: fd_inc_sndbuf(fd, SNDBUF_SIZE); if (!__sync_bool_compare_and_swap(&fd_plus_one, 0, fd+1)) { - close_nointr_nofail(fd); + safe_close(fd); goto retry; } @@ -316,7 +316,7 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) { n = writev(buffer_fd, w, j); if (n < 0) { - close_nointr_nofail(buffer_fd); + safe_close(buffer_fd); return -errno; } @@ -336,7 +336,7 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) { mh.msg_controllen = cmsg->cmsg_len; k = sendmsg(fd, &mh, MSG_NOSIGNAL); - close_nointr_nofail(buffer_fd); + safe_close(buffer_fd); if (k < 0) return -errno; @@ -412,12 +412,12 @@ _public_ int sd_journal_stream_fd(const char *identifier, int priority, int leve r = connect(fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path)); if (r < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } if (shutdown(fd, SHUT_RD) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -445,12 +445,12 @@ _public_ int sd_journal_stream_fd(const char *identifier, int priority, int leve r = loop_write(fd, header, l, false); if (r < 0) { - close_nointr_nofail(fd); + safe_close(fd); return (int) r; } if ((size_t) r != l) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c index 9434cc925..31bae5a8f 100644 --- a/src/journal/journal-verify.c +++ b/src/journal/journal-verify.c @@ -1222,9 +1222,9 @@ int journal_file_verify( mmap_cache_close_fd(f->mmap, entry_fd); mmap_cache_close_fd(f->mmap, entry_array_fd); - close_nointr_nofail(data_fd); - close_nointr_nofail(entry_fd); - close_nointr_nofail(entry_array_fd); + safe_close(data_fd); + safe_close(entry_fd); + safe_close(entry_array_fd); if (first_contained) *first_contained = le64toh(f->header->head_entry_realtime); @@ -1247,17 +1247,17 @@ fail: if (data_fd >= 0) { mmap_cache_close_fd(f->mmap, data_fd); - close_nointr_nofail(data_fd); + safe_close(data_fd); } if (entry_fd >= 0) { mmap_cache_close_fd(f->mmap, entry_fd); - close_nointr_nofail(entry_fd); + safe_close(entry_fd); } if (entry_array_fd >= 0) { mmap_cache_close_fd(f->mmap, entry_array_fd); - close_nointr_nofail(entry_array_fd); + safe_close(entry_array_fd); } return r; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index d49cb0753..86453e65c 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1290,7 +1290,7 @@ static int setup_keys(void) { n = now(CLOCK_REALTIME); n /= arg_interval; - close_nointr_nofail(fd); + safe_close(fd); fd = mkostemp_safe(k, O_WRONLY|O_CLOEXEC); if (fd < 0) { log_error("Failed to open %s: %m", k); @@ -1389,8 +1389,7 @@ static int setup_keys(void) { r = 0; finish: - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); if (k) { unlink(k); diff --git a/src/journal/journald-console.c b/src/journal/journald-console.c index 35da52af2..3db5fc50a 100644 --- a/src/journal/journald-console.c +++ b/src/journal/journald-console.c @@ -107,5 +107,5 @@ void server_forward_console( if (writev(fd, iovec, n) < 0) log_debug("Failed to write to %s for logging: %m", tty); - close_nointr_nofail(fd); + safe_close(fd); } diff --git a/src/journal/journald-kmsg.c b/src/journal/journald-kmsg.c index 05b128f84..35948ea75 100644 --- a/src/journal/journald-kmsg.c +++ b/src/journal/journald-kmsg.c @@ -428,19 +428,14 @@ int server_open_dev_kmsg(Server *s) { return 0; fail: - if (s->dev_kmsg_event_source) - s->dev_kmsg_event_source = sd_event_source_unref(s->dev_kmsg_event_source); - - if (s->dev_kmsg_fd >= 0) { - close_nointr_nofail(s->dev_kmsg_fd); - s->dev_kmsg_fd = -1; - } + s->dev_kmsg_event_source = sd_event_source_unref(s->dev_kmsg_event_source); + s->dev_kmsg_fd = safe_close(s->dev_kmsg_fd); return r; } int server_open_kernel_seqnum(Server *s) { - int fd; + _cleanup_close_ int fd; uint64_t *p; assert(s); @@ -457,18 +452,15 @@ int server_open_kernel_seqnum(Server *s) { if (posix_fallocate(fd, 0, sizeof(uint64_t)) < 0) { log_error("Failed to allocate sequential number file, ignoring: %m"); - close_nointr_nofail(fd); return 0; } p = mmap(NULL, sizeof(uint64_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { log_error("Failed to map sequential number file, ignoring: %m"); - close_nointr_nofail(fd); return 0; } - close_nointr_nofail(fd); s->kernel_seqnum = p; return 0; diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 96ef66db5..1d9c35b30 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -1435,8 +1435,7 @@ static int server_open_hostname(Server *s) { if (r == -EPERM) { log_warning("Failed to register hostname fd in event loop: %s. Ignoring.", strerror(-r)); - close_nointr_nofail(s->hostname_fd); - s->hostname_fd = -1; + s->hostname_fd = safe_close(s->hostname_fd); return 0; } @@ -1644,20 +1643,11 @@ void server_done(Server *s) { sd_event_source_unref(s->hostname_event_source); sd_event_unref(s->event); - if (s->syslog_fd >= 0) - close_nointr_nofail(s->syslog_fd); - - if (s->native_fd >= 0) - close_nointr_nofail(s->native_fd); - - if (s->stdout_fd >= 0) - close_nointr_nofail(s->stdout_fd); - - if (s->dev_kmsg_fd >= 0) - close_nointr_nofail(s->dev_kmsg_fd); - - if (s->hostname_fd >= 0) - close_nointr_nofail(s->hostname_fd); + safe_close(s->syslog_fd); + safe_close(s->native_fd); + safe_close(s->stdout_fd); + safe_close(s->dev_kmsg_fd); + safe_close(s->hostname_fd); if (s->rate_limit) journal_rate_limit_free(s->rate_limit); diff --git a/src/journal/journald-stream.c b/src/journal/journald-stream.c index 36fc75526..84e7bce3d 100644 --- a/src/journal/journald-stream.c +++ b/src/journal/journald-stream.c @@ -337,8 +337,7 @@ void stdout_stream_free(StdoutStream *s) { s->event_source = sd_event_source_unref(s->event_source); } - if (s->fd >= 0) - close_nointr_nofail(s->fd); + safe_close(s->fd); #ifdef HAVE_SELINUX if (s->security_context) @@ -373,13 +372,13 @@ static int stdout_stream_new(sd_event_source *es, int listen_fd, uint32_t revent if (s->n_stdout_streams >= STDOUT_STREAMS_MAX) { log_warning("Too many stdout streams, refusing connection."); - close_nointr_nofail(fd); + safe_close(fd); return 0; } stream = new0(StdoutStream, 1); if (!stream) { - close_nointr_nofail(fd); + safe_close(fd); return log_oom(); } diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 2dbfda03a..d6c13c388 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -1850,8 +1850,7 @@ _public_ void sd_journal_close(sd_journal *j) { hashmap_free(j->directories_by_path); hashmap_free(j->directories_by_wd); - if (j->inotify_fd >= 0) - close_nointr_nofail(j->inotify_fd); + safe_close(j->inotify_fd); if (j->mmap) { log_debug("mmap cache statistics: %u hit, %u miss", mmap_cache_get_hit(j->mmap), mmap_cache_get_missed(j->mmap)); diff --git a/src/journal/test-journal-verify.c b/src/journal/test-journal-verify.c index 054007420..3b181c679 100644 --- a/src/journal/test-journal-verify.c +++ b/src/journal/test-journal-verify.c @@ -48,7 +48,7 @@ static void bit_toggle(const char *fn, uint64_t p) { r = pwrite(fd, &b, 1, p/8); assert(r == 1); - close_nointr_nofail(fd); + safe_close(fd); } static int raw_verify(const char *fn, const char *verification_key) { diff --git a/src/journal/test-mmap-cache.c b/src/journal/test-mmap-cache.c index 7d03bfe9d..b7bb260fc 100644 --- a/src/journal/test-mmap-cache.c +++ b/src/journal/test-mmap-cache.c @@ -72,9 +72,9 @@ int main(int argc, char *argv[]) { mmap_cache_unref(m); - close_nointr_nofail(x); - close_nointr_nofail(y); - close_nointr_nofail(z); + safe_close(x); + safe_close(y); + safe_close(z); return 0; } diff --git a/src/libsystemd-dhcp/dhcp-network.c b/src/libsystemd-dhcp/dhcp-network.c index 934e8bf13..29e915c47 100644 --- a/src/libsystemd-dhcp/dhcp-network.c +++ b/src/libsystemd-dhcp/dhcp-network.c @@ -52,7 +52,7 @@ int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link) return -errno; if (bind(s, &link->sa, sizeof(link->ll)) < 0) { - close_nointr_nofail(s); + safe_close(s); return -errno; } @@ -73,7 +73,7 @@ int dhcp_network_bind_udp_socket(int index, be32_t address, uint16_t port) return -errno; if (bind(s, &src.sa, sizeof(src.in)) < 0) { - close_nointr_nofail(s); + safe_close(s); return -errno; } diff --git a/src/libsystemd-dhcp/sd-dhcp-client.c b/src/libsystemd-dhcp/sd-dhcp-client.c index 0c82260df..7b2f24b66 100644 --- a/src/libsystemd-dhcp/sd-dhcp-client.c +++ b/src/libsystemd-dhcp/sd-dhcp-client.c @@ -175,9 +175,7 @@ static int client_stop(sd_dhcp_client *client, int error) { client->receive_message = sd_event_source_unref(client->receive_message); - if (client->fd >= 0) - close(client->fd); - client->fd = -1; + client->fd = safe_close(client->fd); client->timeout_resend = sd_event_source_unref(client->timeout_resend); @@ -527,12 +525,8 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata) sd_dhcp_client *client = userdata; int r; - if (client->fd >= 0) { - client->receive_message = - sd_event_source_unref(client->receive_message); - close(client->fd); - client->fd = -1; - } + client->receive_message = sd_event_source_unref(client->receive_message); + client->fd = safe_close(client->fd); client->state = DHCP_STATE_REBINDING; client->attempt = 1; @@ -828,8 +822,7 @@ static int client_handle_message(sd_dhcp_client *client, DHCPMessage *message, client->receive_message = sd_event_source_unref(client->receive_message); - close(client->fd); - client->fd = -1; + client->fd = safe_close(client->fd); } r = 0; diff --git a/src/libsystemd/sd-bus/bus-container.c b/src/libsystemd/sd-bus/bus-container.c index d330363b6..2cd0e1f99 100644 --- a/src/libsystemd/sd-bus/bus-container.c +++ b/src/libsystemd/sd-bus/bus-container.c @@ -154,8 +154,7 @@ int bus_container_connect_kernel(sd_bus *b) { if (child == 0) { pid_t grandchild; - close_nointr_nofail(pair[0]); - pair[0] = -1; + pair[0] = safe_close(pair[0]); r = namespace_enter(pidnsfd, mntnsfd, rootfd); if (r < 0) @@ -202,8 +201,7 @@ int bus_container_connect_kernel(sd_bus *b) { _exit(si.si_status); } - close_nointr_nofail(pair[1]); - pair[1] = -1; + pair[1] = safe_close(pair[1]); r = wait_for_terminate(child, &si); if (r < 0) diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index 297ea2d2c..436d46901 100644 --- a/src/libsystemd/sd-bus/bus-kernel.c +++ b/src/libsystemd/sd-bus/bus-kernel.c @@ -810,7 +810,7 @@ static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) { if (d->type == KDBUS_ITEM_FDS) close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int)); else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD) - close_nointr_nofail(d->memfd.fd); + safe_close(d->memfd.fd); } } @@ -1164,7 +1164,7 @@ static void close_and_munmap(int fd, void *address, size_t size) { if (size > 0) assert_se(munmap(address, PAGE_ALIGN(size)) >= 0); - close_nointr_nofail(fd); + safe_close(fd); } void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, size_t allocated) { @@ -1312,14 +1312,14 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) { make->flags = KDBUS_MAKE_POLICY_OPEN | (world ? KDBUS_MAKE_ACCESS_WORLD : 0); if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } /* The higher 32bit of the flags field are considered * 'incompatible flags'. Refuse them all for now. */ if (make->flags > 0xFFFFFFFFULL) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOTSUP; } @@ -1328,7 +1328,7 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) { p = strjoin("/dev/kdbus/", n->str, "/bus", NULL); if (!p) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOMEM; } @@ -1368,7 +1368,7 @@ int bus_kernel_create_starter(const char *bus, const char *name) { hello->pool_size = KDBUS_POOL_SIZE; if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -1376,12 +1376,12 @@ int bus_kernel_create_starter(const char *bus, const char *name) { * 'incompatible flags'. Refuse them all for now. */ if (hello->bus_flags > 0xFFFFFFFFULL || hello->conn_flags > 0xFFFFFFFFULL) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOTSUP; } if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash)) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOTSUP; } @@ -1413,14 +1413,14 @@ int bus_kernel_create_domain(const char *name, char **s) { make->flags = KDBUS_MAKE_POLICY_OPEN | KDBUS_MAKE_ACCESS_WORLD; if (ioctl(fd, KDBUS_CMD_DOMAIN_MAKE, make) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } /* The higher 32bit of the flags field are considered * 'incompatible flags'. Refuse them all for now. */ if (make->flags > 0xFFFFFFFFULL) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOTSUP; } @@ -1429,7 +1429,7 @@ int bus_kernel_create_domain(const char *name, char **s) { p = strappend("/dev/kdbus/domain/", name); if (!p) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOMEM; } @@ -1459,7 +1459,7 @@ int bus_kernel_create_monitor(const char *bus) { hello->pool_size = KDBUS_POOL_SIZE; if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -1467,7 +1467,7 @@ int bus_kernel_create_monitor(const char *bus) { * 'incompatible flags'. Refuse them all for now. */ if (hello->bus_flags > 0xFFFFFFFFULL || hello->conn_flags > 0xFFFFFFFFULL) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOTSUP; } diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index e32f2b827..4fcc69354 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -70,7 +70,7 @@ static void message_free_part(sd_bus_message *m, struct bus_body_part *part) { if (part->mapped > 0) assert_se(munmap(part->data, part->mapped) == 0); - close_nointr_nofail(part->memfd); + safe_close(part->memfd); } } else if (part->munmap_this) @@ -1274,7 +1274,7 @@ static int message_push_fd(sd_bus_message *m, int fd) { f = realloc(m->fds, sizeof(int) * (m->n_fds + 1)); if (!f) { m->poisoned = true; - close_nointr_nofail(copy); + safe_close(copy); return -ENOMEM; } diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index 0c4b6af44..8c594e775 100644 --- a/src/libsystemd/sd-bus/bus-socket.c +++ b/src/libsystemd/sd-bus/bus-socket.c @@ -750,7 +750,7 @@ int bus_socket_exec(sd_bus *b) { assert_se(dup3(s[1], STDOUT_FILENO, 0) == STDOUT_FILENO); if (s[1] != STDIN_FILENO && s[1] != STDOUT_FILENO) - close_nointr_nofail(s[1]); + safe_close(s[1]); fd_cloexec(STDIN_FILENO, false); fd_cloexec(STDOUT_FILENO, false); @@ -767,7 +767,7 @@ int bus_socket_exec(sd_bus *b) { _exit(EXIT_FAILURE); } - close_nointr_nofail(s[1]); + safe_close(s[1]); b->output_fd = b->input_fd = s[0]; bus_socket_setup(b); diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 9640985e2..39460671e 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -62,10 +62,10 @@ static void bus_close_fds(sd_bus *b) { detach_io_events(b); if (b->input_fd >= 0) - close_nointr_nofail(b->input_fd); + safe_close(b->input_fd); if (b->output_fd >= 0 && b->output_fd != b->input_fd) - close_nointr_nofail(b->output_fd); + safe_close(b->output_fd); b->input_fd = b->output_fd = -1; } diff --git a/src/libsystemd/sd-bus/sd-memfd.c b/src/libsystemd/sd-bus/sd-memfd.c index 7c71476ee..8183ba624 100644 --- a/src/libsystemd/sd-bus/sd-memfd.c +++ b/src/libsystemd/sd-bus/sd-memfd.c @@ -106,7 +106,7 @@ _public_ int sd_memfd_new(sd_memfd **m, const char *name) { n = new0(struct sd_memfd, 1); if (!n) { - close_nointr_nofail(cmd->fd); + safe_close(cmd->fd); return -ENOMEM; } @@ -143,7 +143,7 @@ _public_ void sd_memfd_free(sd_memfd *m) { if (m->f) fclose(m->f); else - close_nointr_nofail(m->fd); + safe_close(m->fd); free(m); } diff --git a/src/libsystemd/sd-bus/test-bus-chat.c b/src/libsystemd/sd-bus/test-bus-chat.c index 113d15ba9..1b9d98fa7 100644 --- a/src/libsystemd/sd-bus/test-bus-chat.c +++ b/src/libsystemd/sd-bus/test-bus-chat.c @@ -232,7 +232,7 @@ static int server(sd_bus *bus) { if (write(fd, &x, 1) < 0) { log_error("Failed to write to fd: %m"); - close_nointr_nofail(fd); + safe_close(fd); goto fail; } diff --git a/src/libsystemd/sd-bus/test-bus-kernel-benchmark.c b/src/libsystemd/sd-bus/test-bus-kernel-benchmark.c index bfeee59d2..90257d4f3 100644 --- a/src/libsystemd/sd-bus/test-bus-kernel-benchmark.c +++ b/src/libsystemd/sd-bus/test-bus-kernel-benchmark.c @@ -270,7 +270,7 @@ int main(int argc, char *argv[]) { CPU_SET(0, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - close_nointr_nofail(bus_ref); + safe_close(bus_ref); sd_bus_unref(b); switch (mode) { diff --git a/src/libsystemd/sd-bus/test-bus-kernel.c b/src/libsystemd/sd-bus/test-bus-kernel.c index 2f0f5aa00..34d000f1c 100644 --- a/src/libsystemd/sd-bus/test-bus-kernel.c +++ b/src/libsystemd/sd-bus/test-bus-kernel.c @@ -137,14 +137,12 @@ int main(int argc, char *argv[]) { assert_se(write(pipe_fds[1], "x", 1) == 1); - close_nointr_nofail(pipe_fds[1]); - pipe_fds[1] = -1; + pipe_fds[1] = safe_close(pipe_fds[1]); r = sd_bus_message_append(m, "h", pipe_fds[0]); assert_se(r >= 0); - close_nointr_nofail(pipe_fds[0]); - pipe_fds[0] = -1; + pipe_fds[0] = safe_close(pipe_fds[0]); r = sd_bus_send(b, m, NULL); assert_se(r >= 0); diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index fdf4d12e4..2794f5654 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -331,20 +331,11 @@ static void event_free(sd_event *e) { if (e->default_event_ptr) *(e->default_event_ptr) = NULL; - if (e->epoll_fd >= 0) - close_nointr_nofail(e->epoll_fd); - - if (e->signal_fd >= 0) - close_nointr_nofail(e->signal_fd); - - if (e->realtime_fd >= 0) - close_nointr_nofail(e->realtime_fd); - - if (e->monotonic_fd >= 0) - close_nointr_nofail(e->monotonic_fd); - - if (e->watchdog_fd >= 0) - close_nointr_nofail(e->watchdog_fd); + safe_close(e->epoll_fd); + safe_close(e->signal_fd); + safe_close(e->realtime_fd); + safe_close(e->monotonic_fd); + safe_close(e->watchdog_fd); prioq_free(e->pending); prioq_free(e->prepare); @@ -691,7 +682,7 @@ static int event_setup_timer_fd( r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, fd, &ev); if (r < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -816,9 +807,7 @@ static int event_update_signal_fd(sd_event *e) { r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, e->signal_fd, &ev); if (r < 0) { - close_nointr_nofail(e->signal_fd); - e->signal_fd = -1; - + e->signal_fd = safe_close(e->signal_fd); return -errno; } @@ -2288,8 +2277,7 @@ _public_ int sd_event_set_watchdog(sd_event *e, int b) { } else { if (e->watchdog_fd >= 0) { epoll_ctl(e->epoll_fd, EPOLL_CTL_DEL, e->watchdog_fd, NULL); - close_nointr_nofail(e->watchdog_fd); - e->watchdog_fd = -1; + e->watchdog_fd = safe_close(e->watchdog_fd); } } @@ -2297,8 +2285,7 @@ _public_ int sd_event_set_watchdog(sd_event *e, int b) { return e->watchdog; fail: - close_nointr_nofail(e->watchdog_fd); - e->watchdog_fd = -1; + e->watchdog_fd = safe_close(e->watchdog_fd); return r; } diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index f05fe10b6..d81012467 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -593,8 +593,7 @@ _public_ sd_resolve* sd_resolve_unref(sd_resolve *resolve) { /* Close all communication channels */ for (i = 0; i < _FD_MAX; i++) - if (resolve->fds[i] >= 0) - close_nointr_nofail(resolve->fds[i]); + safe_close(resolve->fds[i]); for (i = 0; i < QUERIES_MAX && resolve->n_queries > 0; i++) if (resolve->queries[i]) diff --git a/src/libsystemd/sd-rtnl/sd-rtnl.c b/src/libsystemd/sd-rtnl/sd-rtnl.c index 1b9f58372..083552f7f 100644 --- a/src/libsystemd/sd-rtnl/sd-rtnl.c +++ b/src/libsystemd/sd-rtnl/sd-rtnl.c @@ -132,9 +132,7 @@ sd_rtnl *sd_rtnl_unref(sd_rtnl *rtnl) { free(f); } - if (rtnl->fd >= 0) - close_nointr_nofail(rtnl->fd); - + safe_close(rtnl->fd); free(rtnl); } diff --git a/src/login/logind-button.c b/src/login/logind-button.c index 060978dd3..2561d13c6 100644 --- a/src/login/logind-button.c +++ b/src/login/logind-button.c @@ -72,7 +72,7 @@ void button_free(Button *b) { if (b->fd >= 0) { /* If the device has been unplugged close() returns * ENODEV, let's ignore this, hence we don't use - * close_nointr_nofail() */ + * safe_close() */ close(b->fd); } diff --git a/src/login/logind-core.c b/src/login/logind-core.c index e4e593fa5..b2e6a41aa 100644 --- a/src/login/logind-core.c +++ b/src/login/logind-core.c @@ -457,7 +457,7 @@ static int vt_is_busy(unsigned int vtnr) { else r = !!(vt_stat.v_state & (1 << vtnr)); - close_nointr_nofail(fd); + safe_close(fd); return r; } diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index d19d64812..8b329abd7 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -253,8 +253,7 @@ int inhibitor_load(Inhibitor *i) { int fd; fd = inhibitor_create_fifo(i); - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); } return 0; @@ -320,13 +319,8 @@ int inhibitor_create_fifo(Inhibitor *i) { void inhibitor_remove_fifo(Inhibitor *i) { assert(i); - if (i->event_source) - i->event_source = sd_event_source_unref(i->event_source); - - if (i->fifo_fd >= 0) { - close_nointr_nofail(i->fifo_fd); - i->fifo_fd = -1; - } + i->event_source = sd_event_source_unref(i->event_source); + i->fifo_fd = safe_close(i->fifo_fd); if (i->fifo_path) { unlink(i->fifo_path); diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 8f773d28c..b14fadd8b 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -407,8 +407,7 @@ int session_load(Session *s) { trigger the EOF. */ fd = session_create_fifo(s); - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); } if (realtime) { @@ -864,13 +863,8 @@ int session_create_fifo(Session *s) { static void session_remove_fifo(Session *s) { assert(s); - if (s->fifo_event_source) - s->fifo_event_source = sd_event_source_unref(s->fifo_event_source); - - if (s->fifo_fd >= 0) { - close_nointr_nofail(s->fifo_fd); - s->fifo_fd = -1; - } + s->fifo_event_source = sd_event_source_unref(s->fifo_event_source); + s->fifo_fd = safe_close(s->fifo_fd); if (s->fifo_path) { unlink(s->fifo_path); @@ -950,7 +944,7 @@ static int session_open_vt(Session *s) { s->vtfd = open(path, O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY); if (s->vtfd < 0) { log_error("cannot open VT %s of session %s: %m", path, s->id); - return -1; + return -errno; } return s->vtfd; @@ -1026,6 +1020,7 @@ void session_restore_vt(Session *s) { if (read_one_line_file("/sys/module/vt/parameters/default_utf8", &utf8) >= 0 && *utf8 == '1') kb = K_UNICODE; + ioctl(vt, KDSKBMODE, kb); mode.mode = VT_AUTO; @@ -1033,8 +1028,7 @@ void session_restore_vt(Session *s) { fchown(vt, 0, -1); - close_nointr_nofail(vt); - s->vtfd = -1; + s->vtfd = safe_close(s->vtfd); } bool session_is_controller(Session *s, const char *sender) { diff --git a/src/login/logind.c b/src/login/logind.c index 3a514bbf8..4319b0b28 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -145,8 +145,7 @@ void manager_free(Manager *m) { sd_event_source_unref(m->udev_vcsa_event_source); sd_event_source_unref(m->udev_button_event_source); - if (m->console_active_fd >= 0) - close_nointr_nofail(m->console_active_fd); + safe_close(m->console_active_fd); if (m->udev_seat_monitor) udev_monitor_unref(m->udev_seat_monitor); @@ -165,8 +164,7 @@ void manager_free(Manager *m) { sd_bus_unref(m->bus); sd_event_unref(m->event); - if (m->reserve_vt_fd >= 0) - close_nointr_nofail(m->reserve_vt_fd); + safe_close(m->reserve_vt_fd); strv_free(m->kill_only_users); strv_free(m->kill_exclude_users); diff --git a/src/login/pam-module.c b/src/login/pam-module.c index 3958db0c3..1259457ef 100644 --- a/src/login/pam-module.c +++ b/src/login/pam-module.c @@ -484,7 +484,7 @@ _public_ PAM_EXTERN int pam_sm_open_session( r = pam_set_data(handle, "systemd.session-fd", INT_TO_PTR(session_fd+1), NULL); if (r != PAM_SUCCESS) { pam_syslog(handle, LOG_ERR, "Failed to install session fd."); - close_nointr_nofail(session_fd); + safe_close(session_fd); return r; } } diff --git a/src/login/sd-login.c b/src/login/sd-login.c index ef67040eb..0b430a5e9 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -679,7 +679,7 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { if (!category || streq(category, "seat")) { k = inotify_add_watch(fd, "/run/systemd/seats/", IN_MOVED_TO|IN_DELETE); if (k < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -689,7 +689,7 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { if (!category || streq(category, "session")) { k = inotify_add_watch(fd, "/run/systemd/sessions/", IN_MOVED_TO|IN_DELETE); if (k < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -699,7 +699,7 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { if (!category || streq(category, "uid")) { k = inotify_add_watch(fd, "/run/systemd/users/", IN_MOVED_TO|IN_DELETE); if (k < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -709,7 +709,7 @@ _public_ int sd_login_monitor_new(const char *category, sd_login_monitor **m) { if (!category || streq(category, "machine")) { k = inotify_add_watch(fd, "/run/systemd/machines/", IN_MOVED_TO|IN_DELETE); if (k < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } diff --git a/src/login/test-inhibit.c b/src/login/test-inhibit.c index 70b8314e3..70780c30a 100644 --- a/src/login/test-inhibit.c +++ b/src/login/test-inhibit.c @@ -101,11 +101,11 @@ int main(int argc, char*argv[]) { assert(fd2 >= 0); print_inhibitors(bus); - close_nointr_nofail(fd1); + safe_close(fd1); sleep(1); print_inhibitors(bus); - close_nointr_nofail(fd2); + safe_close(fd2); sleep(1); print_inhibitors(bus); diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 32f862d09..dd13bcf5b 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -488,8 +488,7 @@ static int openpt_in_namespace(pid_t pid, int flags) { return -errno; if (child == 0) { - close_nointr_nofail(pair[0]); - pair[0] = -1; + pair[0] = safe_close(pair[0]); r = namespace_enter(pidnsfd, mntnsfd, rootfd); if (r < 0) @@ -513,8 +512,7 @@ static int openpt_in_namespace(pid_t pid, int flags) { _exit(EXIT_SUCCESS); } - close_nointr_nofail(pair[1]); - pair[1] = -1; + pair[1] = safe_close(pair[1]); r = wait_for_terminate(child, &si); if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS) { diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 091307bc4..056daf2e7 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -958,7 +958,7 @@ static int setup_kmsg(const char *dest, int kmsg_socket) { /* Store away the fd in the socket, so that it stays open as * long as we run the child */ k = sendmsg(kmsg_socket, &mh, MSG_DONTWAIT|MSG_NOSIGNAL); - close_nointr_nofail(fd); + safe_close(fd); if (k < 0) { log_error("Failed to send FIFO fd: %m"); @@ -1838,15 +1838,13 @@ int main(int argc, char *argv[]) { if (envp[n_env]) n_env ++; - close_nointr_nofail(master); - master = -1; + master = safe_close(master); close_nointr(STDIN_FILENO); close_nointr(STDOUT_FILENO); close_nointr(STDERR_FILENO); - close_nointr_nofail(kmsg_socket_pair[0]); - kmsg_socket_pair[0] = -1; + kmsg_socket_pair[0] = safe_close(kmsg_socket_pair[0]); reset_all_signal_handlers(); @@ -1856,7 +1854,7 @@ int main(int argc, char *argv[]) { k = open_terminal(console, O_RDWR); if (k != STDIN_FILENO) { if (k >= 0) { - close_nointr_nofail(k); + safe_close(k); k = -EINVAL; } @@ -1923,8 +1921,7 @@ int main(int argc, char *argv[]) { if (setup_kmsg(arg_directory, kmsg_socket_pair[1]) < 0) goto child_fail; - close_nointr_nofail(kmsg_socket_pair[1]); - kmsg_socket_pair[1] = -1; + kmsg_socket_pair[1] = safe_close(kmsg_socket_pair[1]); if (setup_boot_id(arg_directory) < 0) goto child_fail; @@ -2071,8 +2068,7 @@ int main(int argc, char *argv[]) { } eventfd_read(sync_fd, &x); - close_nointr_nofail(sync_fd); - sync_fd = -1; + sync_fd = safe_close(sync_fd); if (!strv_isempty(arg_setenv)) { char **n; @@ -2144,8 +2140,7 @@ int main(int argc, char *argv[]) { goto finish; eventfd_write(sync_fd, 1); - close_nointr_nofail(sync_fd); - sync_fd = -1; + sync_fd = safe_close(sync_fd); k = process_pty(master, &mask, arg_boot ? pid : 0, SIGRTMIN+3); if (k < 0) { diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c index be920062d..c1afd0d60 100644 --- a/src/readahead/readahead-collect.c +++ b/src/readahead/readahead-collect.c @@ -176,8 +176,7 @@ finish: if (start != MAP_FAILED) munmap(start, l); - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -493,16 +492,12 @@ static int collect(const char *root) { log_warning("readlink(%s) failed: %s", fn, strerror(-k)); next_iteration: - if (m->fd >= 0) - close_nointr_nofail(m->fd); + safe_close(m->fd); } } done: - if (fanotify_fd >= 0) { - close_nointr_nofail(fanotify_fd); - fanotify_fd = -1; - } + fanotify_fd = safe_close(fanotify_fd); log_debug("Writing Pack File..."); @@ -592,14 +587,9 @@ done: log_debug("Done."); finish: - if (fanotify_fd >= 0) - close_nointr_nofail(fanotify_fd); - - if (signal_fd >= 0) - close_nointr_nofail(signal_fd); - - if (inotify_fd >= 0) - close_nointr_nofail(inotify_fd); + safe_close(fanotify_fd); + safe_close(signal_fd); + safe_close(inotify_fd); if (pack) { fclose(pack); diff --git a/src/readahead/readahead-common.c b/src/readahead/readahead-common.c index 1edf9cc33..49679fc83 100644 --- a/src/readahead/readahead-common.c +++ b/src/readahead/readahead-common.c @@ -218,7 +218,7 @@ int open_inotify(void) { if (inotify_add_watch(fd, "/run/systemd/readahead", IN_CREATE) < 0) { log_error("Failed to watch /run/systemd/readahead: %m"); - close_nointr_nofail(fd); + safe_close(fd); return -errno; } diff --git a/src/readahead/readahead-replay.c b/src/readahead/readahead-replay.c index cb04e5f9c..8dc194257 100644 --- a/src/readahead/readahead-replay.c +++ b/src/readahead/readahead-replay.c @@ -67,10 +67,8 @@ static int unpack_file(FILE *pack) { if (errno != ENOENT && errno != EPERM && errno != EACCES && errno != ELOOP) log_warning("open(%s) failed: %m", fn); - } else if (file_verify(fd, fn, arg_file_size_max, &st) <= 0) { - close_nointr_nofail(fd); - fd = -1; - } + } else if (file_verify(fd, fn, arg_file_size_max, &st) <= 0) + fd = safe_close(fd); if (fread(&inode, sizeof(inode), 1, pack) != 1) { log_error("Premature end of pack file."); @@ -81,10 +79,8 @@ static int unpack_file(FILE *pack) { if (fd >= 0) { /* If the inode changed the file got deleted, so just * ignore this entry */ - if (st.st_ino != (uint64_t) inode) { - close_nointr_nofail(fd); - fd = -1; - } + if (st.st_ino != (uint64_t) inode) + fd = safe_close(fd); } for (;;) { @@ -129,8 +125,7 @@ static int unpack_file(FILE *pack) { } finish: - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -279,8 +274,7 @@ finish: if (pack) fclose(pack); - if (inotify_fd >= 0) - close_nointr_nofail(inotify_fd); + safe_close(inotify_fd); free(pack_fn); diff --git a/src/reply-password/reply-password.c b/src/reply-password/reply-password.c index 2f168985b..c730216b7 100644 --- a/src/reply-password/reply-password.c +++ b/src/reply-password/reply-password.c @@ -91,7 +91,8 @@ int main(int argc, char *argv[]) { goto finish; } - if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) { + fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); + if (fd < 0) { log_error("socket() failed: %m"); goto finish; } @@ -102,8 +103,7 @@ int main(int argc, char *argv[]) { r = EXIT_SUCCESS; finish: - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c index 2505aa9c9..96f16cc7f 100644 --- a/src/shared/ask-password-api.c +++ b/src/shared/ask-password-api.c @@ -231,8 +231,7 @@ int ask_password_tty( r = 0; finish: - if (notify >= 0) - close_nointr_nofail(notify); + safe_close(notify); if (ttyfd >= 0) { @@ -241,7 +240,7 @@ finish: tcsetattr(ttyfd, TCSADRAIN, &old_termios); } - close_nointr_nofail(ttyfd); + safe_close(ttyfd); } return r; @@ -295,7 +294,7 @@ static int create_socket(char **name) { return fd; fail: - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -526,19 +525,15 @@ int ask_password_agent( r = 0; finish: - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); if (socket_name) { unlink(socket_name); free(socket_name); } - if (socket_fd >= 0) - close_nointr_nofail(socket_fd); - - if (signal_fd >= 0) - close_nointr_nofail(signal_fd); + safe_close(socket_fd); + safe_close(signal_fd); if (f) fclose(f); diff --git a/src/shared/fdset.c b/src/shared/fdset.c index fd27398eb..a2c861de3 100644 --- a/src/shared/fdset.c +++ b/src/shared/fdset.c @@ -82,7 +82,7 @@ int fdset_put_dup(FDSet *s, int fd) { r = fdset_put(s, copy); if (r < 0) { - close_nointr_nofail(copy); + safe_close(copy); return r; } diff --git a/src/shared/install.c b/src/shared/install.c index 94ca73204..71392f367 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -207,7 +207,7 @@ static int remove_marked_symlinks_fd( d = fdopendir(fd); if (!d) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -247,7 +247,7 @@ static int remove_marked_symlinks_fd( p = path_make_absolute(de->d_name, path); if (!p) { - close_nointr_nofail(nfd); + safe_close(nfd); return -ENOMEM; } @@ -347,7 +347,7 @@ static int remove_marked_symlinks( r = q; } while (deleted); - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -370,7 +370,7 @@ static int find_symlinks_fd( d = fdopendir(fd); if (!d) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -406,7 +406,7 @@ static int find_symlinks_fd( p = path_make_absolute(de->d_name, path); if (!p) { - close_nointr_nofail(nfd); + safe_close(nfd); return -ENOMEM; } @@ -1013,7 +1013,7 @@ static int unit_file_load( f = fdopen(fd, "re"); if (!f) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOMEM; } diff --git a/src/shared/log.c b/src/shared/log.c index 8d1067c63..f4d7a0e3b 100644 --- a/src/shared/log.c +++ b/src/shared/log.c @@ -62,7 +62,7 @@ void log_close_console(void) { if (getpid() == 1) { if (console_fd >= 3) - close_nointr_nofail(console_fd); + safe_close(console_fd); console_fd = -1; } @@ -84,12 +84,7 @@ static int log_open_console(void) { } void log_close_kmsg(void) { - - if (kmsg_fd < 0) - return; - - close_nointr_nofail(kmsg_fd); - kmsg_fd = -1; + kmsg_fd = safe_close(kmsg_fd); } static int log_open_kmsg(void) { @@ -105,12 +100,7 @@ static int log_open_kmsg(void) { } void log_close_syslog(void) { - - if (syslog_fd < 0) - return; - - close_nointr_nofail(syslog_fd); - syslog_fd = -1; + syslog_fd = safe_close(syslog_fd); } static int create_log_socket(int type) { @@ -152,7 +142,7 @@ static int log_open_syslog(void) { } if (connect(syslog_fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)) < 0) { - close_nointr_nofail(syslog_fd); + safe_close(syslog_fd); /* Some legacy syslog systems still use stream * sockets. They really shouldn't. But what can we @@ -180,12 +170,7 @@ fail: } void log_close_journal(void) { - - if (journal_fd < 0) - return; - - close_nointr_nofail(journal_fd); - journal_fd = -1; + journal_fd = safe_close(journal_fd); } static int log_open_journal(void) { diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index f9fa978eb..9f4771b3a 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -1154,8 +1154,7 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { if (child == 0) { int fd; - close_nointr_nofail(pair[0]); - pair[0] = -1; + pair[0] = safe_close(pair[0]); r = namespace_enter(pidnsfd, mntnsfd, rootfd); if (r < 0) @@ -1166,7 +1165,7 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { _exit(EXIT_FAILURE); k = loop_read(fd, buf, 36, false); - close_nointr_nofail(fd); + safe_close(fd); if (k != 36) _exit(EXIT_FAILURE); @@ -1177,8 +1176,7 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { _exit(EXIT_SUCCESS); } - close_nointr_nofail(pair[1]); - pair[1] = -1; + pair[1] = safe_close(pair[1]); r = wait_for_terminate(child, &si); if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS) diff --git a/src/shared/spawn-polkit-agent.c b/src/shared/spawn-polkit-agent.c index f9e52cdcb..fccf1e917 100644 --- a/src/shared/spawn-polkit-agent.c +++ b/src/shared/spawn-polkit-agent.c @@ -61,7 +61,7 @@ int polkit_agent_open(void) { POLKIT_AGENT_BINARY_PATH, "--notify-fd", notify_fd, "--fallback", NULL); /* Close the writing side, because that's the one for the agent */ - close_nointr_nofail(pipe_fd[1]); + safe_close(pipe_fd[1]); if (r < 0) log_error("Failed to fork TTY ask password agent: %s", strerror(-r)); @@ -69,7 +69,7 @@ int polkit_agent_open(void) { /* Wait until the agent closes the fd */ fd_wait_for_event(pipe_fd[0], POLLHUP, (usec_t) -1); - close_nointr_nofail(pipe_fd[0]); + safe_close(pipe_fd[0]); return r; } diff --git a/src/shared/util.c b/src/shared/util.c index a1363555f..c2191e250 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -182,13 +182,22 @@ int close_nointr(int fd) { return -errno; } -void close_nointr_nofail(int fd) { - PROTECT_ERRNO; +int safe_close(int fd) { - /* like close_nointr() but cannot fail, and guarantees errno - * is unchanged */ + /* + * Like close_nointr() but cannot fail. Guarantees errno is + * unchanged. Is a NOP with negative fds passed, and returns + * -1, so that it can be used in this syntax: + * + * fd = safe_close(fd); + */ - assert_se(close_nointr(fd) == 0); + if (fd >= 0) { + PROTECT_ERRNO; + assert_se(close_nointr(fd) == 0); + } + + return -1; } void close_many(const int fds[], unsigned n_fd) { @@ -197,7 +206,7 @@ void close_many(const int fds[], unsigned n_fd) { assert(fds || n_fd <= 0); for (i = 0; i < n_fd; i++) - close_nointr_nofail(fds[i]); + safe_close(fds[i]); } int unlink_noerrno(const char *path) { @@ -1712,16 +1721,13 @@ finish: } int reset_terminal(const char *name) { - int fd, r; + _cleanup_close_ int fd = -1; fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC); if (fd < 0) return fd; - r = reset_terminal_fd(fd, true); - close_nointr_nofail(fd); - - return r; + return reset_terminal_fd(fd, true); } int open_terminal(const char *name, int mode) { @@ -1760,12 +1766,12 @@ int open_terminal(const char *name, int mode) { r = isatty(fd); if (r < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } if (!r) { - close_nointr_nofail(fd); + safe_close(fd); return -ENOTTY; } @@ -1954,11 +1960,10 @@ int acquire_terminal( * ended our handle will be dead. It's important that * we do this after sleeping, so that we don't enter * an endless loop. */ - close_nointr_nofail(fd); + safe_close(fd); } - if (notify >= 0) - close_nointr_nofail(notify); + safe_close(notify); r = reset_terminal_fd(fd, true); if (r < 0) @@ -1967,11 +1972,8 @@ int acquire_terminal( return fd; fail: - if (fd >= 0) - close_nointr_nofail(fd); - - if (notify >= 0) - close_nointr_nofail(notify); + safe_close(fd); + safe_close(notify); return r; } @@ -2279,7 +2281,7 @@ int make_stdio(int fd) { t = dup3(fd, STDERR_FILENO, 0); if (fd >= 3) - close_nointr_nofail(fd); + safe_close(fd); if (r < 0 || s < 0 || t < 0) return -errno; @@ -2657,7 +2659,7 @@ int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct d = fdopendir(fd); if (!d) { - close_nointr_nofail(fd); + safe_close(fd); return errno == ENOENT ? 0 : -errno; } @@ -2753,7 +2755,7 @@ int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root assert(fd >= 0); if (fstatfs(fd, &s) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } @@ -2762,7 +2764,7 @@ int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root * non-state data */ if (!is_temporary_fs(&s)) { log_error("Attempted to remove disk file system, and we can't allow that."); - close_nointr_nofail(fd); + safe_close(fd); return -EPERM; } @@ -2808,13 +2810,13 @@ static int rm_rf_internal(const char *path, bool only_dirs, bool delete_root, bo if (!dangerous) { if (fstatfs(fd, &s) < 0) { - close_nointr_nofail(fd); + safe_close(fd); return -errno; } if (!is_temporary_fs(&s)) { log_error("Attempted to remove disk file system, and we can't allow that."); - close_nointr_nofail(fd); + safe_close(fd); return -EPERM; } } @@ -3327,7 +3329,7 @@ char *ellipsize(const char *s, size_t length, unsigned percent) { } int touch(const char *path) { - int fd; + _cleanup_close_ int fd; assert(path); @@ -3339,7 +3341,6 @@ int touch(const char *path) { if (fd < 0) return -errno; - close_nointr_nofail(fd); return 0; } @@ -3502,7 +3503,7 @@ DIR *xopendirat(int fd, const char *name, int flags) { d = fdopendir(nfd); if (!d) { - close_nointr_nofail(nfd); + safe_close(nfd); return NULL; } @@ -4000,16 +4001,13 @@ int terminal_vhangup_fd(int fd) { } int terminal_vhangup(const char *name) { - int fd, r; + _cleanup_close_ int fd; fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC); if (fd < 0) return fd; - r = terminal_vhangup_fd(fd); - close_nointr_nofail(fd); - - return r; + return terminal_vhangup_fd(fd); } int vt_disallocate(const char *name) { @@ -4036,7 +4034,7 @@ int vt_disallocate(const char *name) { "\033[H" /* move home */ "\033[2J", /* clear screen */ 10, false); - close_nointr_nofail(fd); + safe_close(fd); return 0; } @@ -4057,7 +4055,7 @@ int vt_disallocate(const char *name) { return fd; r = ioctl(fd, VT_DISALLOCATE, u); - close_nointr_nofail(fd); + safe_close(fd); if (r >= 0) return 0; @@ -4076,7 +4074,7 @@ int vt_disallocate(const char *name) { "\033[H" /* move home */ "\033[3J", /* clear screen including scrollback, requires Linux 2.6.40 */ 10, false); - close_nointr_nofail(fd); + safe_close(fd); return 0; } @@ -5653,7 +5651,7 @@ int on_ac_power(void) { if (n != 6 || memcmp(contents, "Mains\n", 6)) continue; - close_nointr_nofail(fd); + safe_close(fd); fd = openat(device, "online", O_RDONLY|O_CLOEXEC|O_NOCTTY); if (fd < 0) { if (errno == ENOENT) diff --git a/src/shared/util.h b/src/shared/util.h index 8dff0bcdd..38d649401 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -142,7 +142,8 @@ char *endswith(const char *s, const char *postfix) _pure_; bool first_word(const char *s, const char *word) _pure_; int close_nointr(int fd); -void close_nointr_nofail(int fd); +int safe_close(int fd); + void close_many(const int fds[], unsigned n_fd); int parse_size(const char *t, off_t base, off_t *size); @@ -607,8 +608,7 @@ static inline void freep(void *p) { struct __useless_struct_to_allow_trailing_semicolon__ static inline void closep(int *fd) { - if (*fd >= 0) - close_nointr_nofail(*fd); + safe_close(*fd); } static inline void umaskp(mode_t *u) { diff --git a/src/shared/watchdog.c b/src/shared/watchdog.c index ddbe7afd3..ba9ad9be9 100644 --- a/src/shared/watchdog.c +++ b/src/shared/watchdog.c @@ -164,6 +164,5 @@ void watchdog_close(bool disarm) { } } - close_nointr_nofail(watchdog_fd); - watchdog_fd = -1; + watchdog_fd = safe_close(watchdog_fd); } diff --git a/src/shutdownd/shutdownd.c b/src/shutdownd/shutdownd.c index 4a1719849..0c746d12c 100644 --- a/src/shutdownd/shutdownd.c +++ b/src/shutdownd/shutdownd.c @@ -438,8 +438,7 @@ int main(int argc, char *argv[]) { finish: for (i = 0; i < _FD_MAX; i++) - if (pollfd[i].fd >= 0) - close_nointr_nofail(pollfd[i].fd); + safe_close(pollfd[i].fd); if (unlink_nologin) unlink("/run/nologin"); diff --git a/src/socket-proxy/socket-proxyd.c b/src/socket-proxy/socket-proxyd.c index a42e5ae27..c172bebe8 100644 --- a/src/socket-proxy/socket-proxyd.c +++ b/src/socket-proxy/socket-proxyd.c @@ -76,10 +76,8 @@ static void connection_free(Connection *c) { sd_event_source_unref(c->server_event_source); sd_event_source_unref(c->client_event_source); - if (c->server_fd >= 0) - close_nointr_nofail(c->server_fd); - if (c->client_fd >= 0) - close_nointr_nofail(c->client_fd); + safe_close(c->server_fd); + safe_close(c->client_fd); close_pipe(c->server_to_client_buffer); close_pipe(c->client_to_server_buffer); @@ -224,8 +222,7 @@ static int connection_shovel( shoveled = true; } else if (z == 0 || errno == EPIPE || errno == ECONNRESET) { *from_source = sd_event_source_unref(*from_source); - close_nointr_nofail(*from); - *from = -1; + *from = safe_close(*from); } else if (errno != EAGAIN && errno != EINTR) { log_error("Failed to splice: %m"); return -errno; @@ -239,8 +236,7 @@ static int connection_shovel( shoveled = true; } else if (z == 0 || errno == EPIPE || errno == ECONNRESET) { *to_source = sd_event_source_unref(*to_source); - close_nointr_nofail(*to); - *to = -1; + *to = safe_close(*to); } else if (errno != EAGAIN && errno != EINTR) { log_error("Failed to splice: %m"); return -errno; @@ -396,7 +392,7 @@ static int add_connection_socket(Context *context, sd_event *event, int fd) { if (set_size(context->connections) > CONNECTIONS_MAX) { log_warning("Hit connection limit, refusing connection."); - close_nointr_nofail(fd); + safe_close(fd); return 0; } @@ -482,7 +478,7 @@ static int accept_cb(sd_event_source *s, int fd, uint32_t revents, void *userdat r = add_connection_socket(context, sd_event_source_get_event(s), nfd); if (r < 0) { log_error("Failed to accept connection, ignoring: %s", strerror(-r)); - close_nointr_nofail(fd); + safe_close(fd); } } diff --git a/src/test/test-util.c b/src/test/test-util.c index 74f83a262..3f6af67fb 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -67,7 +67,7 @@ static void test_close_many(void) { assert_se(fcntl(fds[1], F_GETFD) == -1); assert_se(fcntl(fds[2], F_GETFD) >= 0); - close_nointr_nofail(fds[2]); + safe_close(fds[2]); unlink(name0); unlink(name1); diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 8211ff4f0..2a48180f3 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -492,7 +492,7 @@ static int write_one_file(Item *i, const char *path) { unescaped = cunescape(i->argument); if (unescaped == NULL) { - close_nointr_nofail(fd); + safe_close(fd); return log_oom(); } @@ -501,12 +501,12 @@ static int write_one_file(Item *i, const char *path) { if (n < 0 || (size_t) n < l) { log_error("Failed to write file %s: %s", path, n < 0 ? strerror(-n) : "Short write"); - close_nointr_nofail(fd); + safe_close(fd); return n < 0 ? n : -EIO; } } - close_nointr_nofail(fd); + safe_close(fd); if (stat(path, &st) < 0) { log_error("stat(%s) failed: %m", path); diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c index 5acb41704..a144bdcb9 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -234,11 +234,8 @@ static int ask_password_plymouth( r = 0; finish: - if (notify >= 0) - close_nointr_nofail(notify); - - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(notify); + safe_close(fd); free(packet); @@ -372,7 +369,7 @@ static int parse_password(const char *filename, char **wall) { r = ask_password_tty(message, not_after, filename, &password); if (arg_console) { - close_nointr_nofail(tty_fd); + safe_close(tty_fd); release_terminal(); } @@ -419,8 +416,7 @@ static int parse_password(const char *filename, char **wall) { finish: fclose(f); - if (socket_fd >= 0) - close_nointr_nofail(socket_fd); + safe_close(socket_fd); free(packet); free(socket_name); @@ -492,7 +488,7 @@ static bool wall_tty_match(const char *path) { return true; /* What, we managed to open the pipe? Then this tty is filtered. */ - close_nointr_nofail(fd); + safe_close(fd); return false; } @@ -614,14 +610,9 @@ static int watch_passwords(void) { r = 0; finish: - if (notify >= 0) - close_nointr_nofail(notify); - - if (signal_fd >= 0) - close_nointr_nofail(signal_fd); - - if (tty_block_fd >= 0) - close_nointr_nofail(tty_block_fd); + safe_close(notify); + safe_close(signal_fd); + safe_close(tty_block_fd); return r; } diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 05225e011..133926f44 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -127,8 +127,7 @@ void link_config_ctx_free(link_config_ctx *ctx) { if (!ctx) return; - if (ctx->ethtool_fd >= 0) - close_nointr_nofail(ctx->ethtool_fd); + safe_close(ctx->ethtool_fd); sd_rtnl_unref(ctx->rtnl); diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 1bbf737c3..0f2b7066e 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -301,8 +301,7 @@ finish: free(vc_font_map); free(vc_font_unimap); - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; }