diff --git a/coccinelle/take-fd.cocci b/coccinelle/take-fd.cocci new file mode 100644 index 0000000000..ba242483cd --- /dev/null +++ b/coccinelle/take-fd.cocci @@ -0,0 +1,14 @@ +@@ +local idexpression p; +expression q; +@@ +- p = q; +- q = -1; +- return p; ++ return TAKE_FD(q); +@@ +expression p, q; +@@ +- p = q; +- q = -1; ++ p = TAKE_FD(q); diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index 6d7875361c..0726aac38c 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -484,10 +484,7 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags) { if (r < 0) return r; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } try_pipe: @@ -524,10 +521,7 @@ try_pipe: (void) fd_nonblock(pipefds[0], false); - r = pipefds[0]; - pipefds[0] = -1; - - return r; + return TAKE_FD(pipefds[0]); } try_dev_shm: diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index 635a538b5a..007580b48f 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -105,3 +105,11 @@ int rearrange_stdio(int original_input_fd, int original_output_fd, int original_ static inline int make_null_stdio(void) { return rearrange_stdio(-1, -1, -1); } + +/* Like TAKE_PTR() but for file descriptors, resetting them to -1 */ +#define TAKE_FD(fd) \ + ({ \ + int _fd_ = (fd); \ + (fd) = -1; \ + _fd_; \ + }) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index aec8b00744..150c47a719 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -730,8 +730,7 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, } safe_close(fd); - fd = fd_parent; - fd_parent = -1; + fd = TAKE_FD(fd_parent); continue; } @@ -849,8 +848,7 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, /* And iterate again, but go one directory further down. */ safe_close(fd); - fd = child; - child = -1; + fd = TAKE_FD(child); } if (!done) { @@ -864,16 +862,11 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, *ret = TAKE_PTR(done); if (flags & CHASE_OPEN) { - int q; - /* Return the O_PATH fd we currently are looking to the caller. It can translate it to a proper fd by * opening /proc/self/fd/xyz. */ assert(fd >= 0); - q = fd; - fd = -1; - - return q; + return TAKE_FD(fd); } return exists; diff --git a/src/basic/memfd-util.c b/src/basic/memfd-util.c index e7eb895462..758ba6458a 100644 --- a/src/basic/memfd-util.c +++ b/src/basic/memfd-util.c @@ -168,8 +168,5 @@ int memfd_new_and_map(const char *name, size_t sz, void **p) { if (r < 0) return r; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 87691d1d38..c7e2d2abb7 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -496,10 +496,7 @@ int acquire_terminal( fd = safe_close(fd); } - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } int release_terminal(void) { diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c index f87a5a20d4..7236dcfabd 100644 --- a/src/core/dynamic-user.c +++ b/src/core/dynamic-user.c @@ -319,10 +319,7 @@ static int pick_uid(char **suggested_paths, const char *name, uid_t *ret_uid) { (void) make_uid_symlinks(candidate, name, true); /* also add direct lookup symlinks */ *ret_uid = candidate; - r = lock_fd; - lock_fd = -1; - - return r; + return TAKE_FD(lock_fd); next: ; diff --git a/src/core/manager.c b/src/core/manager.c index 7026a58d73..9a71f5f2e7 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -844,8 +844,7 @@ static int manager_setup_notify(Manager *m) { if (r < 0) return log_error_errno(errno, "SO_PASSCRED failed: %m"); - m->notify_fd = fd; - fd = -1; + m->notify_fd = TAKE_FD(fd); log_debug("Using notification socket %s", m->notify_socket); } diff --git a/src/core/socket.c b/src/core/socket.c index b3c09f67c0..eecf6fbe18 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -1238,10 +1238,7 @@ static int fifo_address_create( goto fail; } - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); fail: mac_selinux_create_file_clear(); @@ -1251,7 +1248,6 @@ fail: static int special_address_create(const char *path, bool writable) { _cleanup_close_ int fd = -1; struct stat st; - int r; assert(path); @@ -1266,16 +1262,12 @@ static int special_address_create(const char *path, bool writable) { if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) return -EEXIST; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } static int usbffs_address_create(const char *path) { _cleanup_close_ int fd = -1; struct stat st; - int r; assert(path); @@ -1290,10 +1282,7 @@ static int usbffs_address_create(const char *path) { if (!S_ISREG(st.st_mode)) return -EEXIST; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } static int mq_address_create( @@ -1306,7 +1295,6 @@ static int mq_address_create( struct stat st; mode_t old_mask; struct mq_attr _attr, *attr = NULL; - int r; assert(path); @@ -1338,10 +1326,7 @@ static int mq_address_create( st.st_gid != getgid()) return -EEXIST; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } static int socket_symlink(Socket *s) { diff --git a/src/import/export-raw.c b/src/import/export-raw.c index eaa6d10915..9cab838b96 100644 --- a/src/import/export-raw.c +++ b/src/import/export-raw.c @@ -326,13 +326,10 @@ int raw_export_start(RawExport *e, const char *path, int fd, ImportCompressType /* Try to take a reflink snapshot of the file, if we can t make the export atomic */ tfd = reflink_snapshot(sfd, path); - if (tfd >= 0) { - e->input_fd = tfd; - tfd = -1; - } else { - e->input_fd = sfd; - sfd = -1; - } + if (tfd >= 0) + e->input_fd = TAKE_FD(tfd); + else + e->input_fd = TAKE_FD(sfd); r = import_compress_init(&e->compress, compress); if (r < 0) diff --git a/src/import/import-common.c b/src/import/import-common.c index a3dc1dde8c..b9d8c23905 100644 --- a/src/import/import-common.c +++ b/src/import/import-common.c @@ -117,13 +117,9 @@ int import_fork_tar_x(const char *path, pid_t *ret) { _exit(EXIT_FAILURE); } - pipefd[0] = safe_close(pipefd[0]); - r = pipefd[1]; - pipefd[1] = -1; - *ret = pid; - return r; + return TAKE_FD(pipefd[1]); } int import_fork_tar_c(const char *path, pid_t *ret) { @@ -165,11 +161,7 @@ int import_fork_tar_c(const char *path, pid_t *ret) { _exit(EXIT_FAILURE); } - pipefd[1] = safe_close(pipefd[1]); - r = pipefd[0]; - pipefd[0] = -1; - *ret = pid; - return r; + return TAKE_FD(pipefd[0]); } diff --git a/src/import/import-raw.c b/src/import/import-raw.c index f117c94da2..032b3dcda2 100644 --- a/src/import/import-raw.c +++ b/src/import/import-raw.c @@ -210,8 +210,7 @@ static int raw_import_maybe_convert_qcow2(RawImport *i) { free_and_replace(i->temp_path, t); safe_close(i->output_fd); - i->output_fd = converted_fd; - converted_fd = -1; + i->output_fd = TAKE_FD(converted_fd); return 1; } diff --git a/src/import/importd.c b/src/import/importd.c index a0c02b26ab..55e61b485f 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -453,8 +453,7 @@ static int transfer_start(Transfer *t) { } pipefd[1] = safe_close(pipefd[1]); - t->log_fd = pipefd[0]; - pipefd[0] = -1; + t->log_fd = TAKE_FD(pipefd[0]); t->stdin_fd = safe_close(t->stdin_fd); diff --git a/src/import/pull-raw.c b/src/import/pull-raw.c index 880cb84ba8..9784141871 100644 --- a/src/import/pull-raw.c +++ b/src/import/pull-raw.c @@ -272,8 +272,7 @@ static int raw_pull_maybe_convert_qcow2(RawPull *i) { free_and_replace(i->temp_path, t); safe_close(i->raw_job->disk_fd); - i->raw_job->disk_fd = converted_fd; - converted_fd = -1; + i->raw_job->disk_fd = TAKE_FD(converted_fd); return 1; } diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c index 73329ba024..b6adf64c27 100644 --- a/src/journal/journal-send.c +++ b/src/journal/journal-send.c @@ -441,9 +441,7 @@ _public_ int sd_journal_stream_fd(const char *identifier, int priority, int leve if (r < 0) return r; - r = fd; - fd = -1; - return r; + return TAKE_FD(fd); } _public_ int sd_journal_print_with_location(int priority, const char *file, const char *line, const char *func, const char *format, ...) { diff --git a/src/libsystemd-network/arp-util.c b/src/libsystemd-network/arp-util.c index b8e9b2e496..3217ac0d1f 100644 --- a/src/libsystemd-network/arp-util.c +++ b/src/libsystemd-network/arp-util.c @@ -103,10 +103,7 @@ int arp_network_bind_raw_socket(int ifindex, be32_t address, const struct ether_ if (r < 0) return -errno; - r = s; - s = -1; - - return r; + return TAKE_FD(s); } static int arp_send_packet(int fd, int ifindex, diff --git a/src/libsystemd-network/dhcp-network.c b/src/libsystemd-network/dhcp-network.c index 602bf08a60..ac9a7a31b6 100644 --- a/src/libsystemd-network/dhcp-network.c +++ b/src/libsystemd-network/dhcp-network.c @@ -123,10 +123,7 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link, if (r < 0) return -errno; - r = s; - s = -1; - - return r; + return TAKE_FD(s); } int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, @@ -211,10 +208,7 @@ int dhcp_network_bind_udp_socket(int ifindex, be32_t address, uint16_t port) { if (r < 0) return -errno; - r = s; - s = -1; - - return r; + return TAKE_FD(s); } int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, diff --git a/src/libsystemd-network/dhcp6-network.c b/src/libsystemd-network/dhcp6-network.c index b3b8fddbcb..70f5909304 100644 --- a/src/libsystemd-network/dhcp6-network.c +++ b/src/libsystemd-network/dhcp6-network.c @@ -67,9 +67,7 @@ int dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) { if (r < 0) return -errno; - r = s; - s = -1; - return r; + return TAKE_FD(s); } int dhcp6_network_send_udp_socket(int s, struct in6_addr *server_address, diff --git a/src/libsystemd-network/icmp6-util.c b/src/libsystemd-network/icmp6-util.c index dd4e28bfd9..2347251572 100644 --- a/src/libsystemd-network/icmp6-util.c +++ b/src/libsystemd-network/icmp6-util.c @@ -98,9 +98,7 @@ static int icmp6_bind_router_message(const struct icmp6_filter *filter, if (r < 0) return -errno; - r = s; - s = -1; - return r; + return TAKE_FD(s); } int icmp6_bind_router_solicitation(int index) { diff --git a/src/libsystemd-network/lldp-network.c b/src/libsystemd-network/lldp-network.c index cb3841ef22..c653813cfb 100644 --- a/src/libsystemd-network/lldp-network.c +++ b/src/libsystemd-network/lldp-network.c @@ -92,8 +92,5 @@ int lldp_network_bind_raw_socket(int ifindex) { if (r < 0) return -errno; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 7aeeafd8e1..5673ea4f9e 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -1145,8 +1145,7 @@ void session_restore_vt(Session *s) { * little dance to avoid having the terminal be available * for reuse before we've cleaned it up. */ - old_fd = s->vtfd; - s->vtfd = -1; + old_fd = TAKE_FD(s->vtfd); vt = session_open_vt(s); safe_close(old_fd); diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index bf6aac8300..305bb6afe8 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -325,7 +325,7 @@ static int dns_scope_socket( union sockaddr_union sa = {}; socklen_t salen; static const int one = 1; - int ret, r, ifindex; + int r, ifindex; assert(s); @@ -409,10 +409,7 @@ static int dns_scope_socket( if (r < 0 && errno != EINPROGRESS) return -errno; - ret = fd; - fd = -1; - - return ret; + return TAKE_FD(fd); } int dns_scope_socket_udp(DnsScope *s, DnsServer *server, uint16_t port) { diff --git a/src/resolve/resolved-dns-stub.c b/src/resolve/resolved-dns-stub.c index 5ce8d240dd..20ff8a1d3b 100644 --- a/src/resolve/resolved-dns-stub.c +++ b/src/resolve/resolved-dns-stub.c @@ -447,10 +447,8 @@ static int manager_dns_stub_udp_fd(Manager *m) { return r; (void) sd_event_source_set_description(m->dns_stub_udp_event_source, "dns-stub-udp"); - m->dns_stub_udp_fd = fd; - fd = -1; - return m->dns_stub_udp_fd; + return m->dns_stub_udp_fd = TAKE_FD(fd); } static int on_dns_stub_stream_packet(DnsStream *s) { @@ -542,10 +540,8 @@ static int manager_dns_stub_tcp_fd(Manager *m) { return r; (void) sd_event_source_set_description(m->dns_stub_tcp_event_source, "dns-stub-tcp"); - m->dns_stub_tcp_fd = fd; - fd = -1; - return m->dns_stub_tcp_fd; + return m->dns_stub_tcp_fd = TAKE_FD(fd); } int manager_dns_stub_start(Manager *m) { diff --git a/src/shared/machine-pool.c b/src/shared/machine-pool.c index 031d443e9e..68e5bd19a0 100644 --- a/src/shared/machine-pool.c +++ b/src/shared/machine-pool.c @@ -89,11 +89,8 @@ static int setup_machine_raw(uint64_t size, sd_bus_error *error) { * /var/lib/machines. */ fd = open("/var/lib/machines.raw", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); - if (fd >= 0) { - r = fd; - fd = -1; - return r; - } + if (fd >= 0) + return TAKE_FD(fd); if (errno != ENOENT) return sd_bus_error_set_errnof(error, errno, "Failed to open /var/lib/machines.raw: %m"); @@ -162,10 +159,7 @@ static int setup_machine_raw(uint64_t size, sd_bus_error *error) { goto fail; } - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); fail: unlink_noerrno(tmp); diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 6bde3da1c8..92656c6383 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -325,8 +325,8 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) { static int find_source_vc(char **ret_path, unsigned *ret_idx) { _cleanup_free_ char *path = NULL; + int r, err = 0; unsigned i; - int ret_fd, r, err = 0; path = new(char, sizeof("/dev/tty63")); if (!path) @@ -359,18 +359,16 @@ static int find_source_vc(char **ret_path, unsigned *ret_idx) { /* all checks passed, return this one as a source console */ *ret_idx = i; *ret_path = TAKE_PTR(path); - ret_fd = fd; - fd = -1; - return ret_fd; + return TAKE_FD(fd); } return log_error_errno(err, "No usable source console found: %m"); } static int verify_source_vc(char **ret_path, const char *src_vc) { - char *path; _cleanup_close_ int fd = -1; - int ret_fd, r; + char *path; + int r; fd = open_terminal(src_vc, O_RDWR|O_CLOEXEC|O_NOCTTY); if (fd < 0) @@ -393,9 +391,7 @@ static int verify_source_vc(char **ret_path, const char *src_vc) { return log_oom(); *ret_path = path; - ret_fd = fd; - fd = -1; - return ret_fd; + return TAKE_FD(fd); } int main(int argc, char **argv) {