From 8907d0860be1dfeeda2b21b0be0adebca26eb87d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 5 May 2026 18:38:21 +0200 Subject: [PATCH] modules: loop_add_io with close=true owns the fd We should not close the fd when loop_add_io with close=true fails because the fd is already closed. --- src/modules/module-avb/stream.c | 5 +---- src/modules/module-netjack2-driver.c | 1 - src/modules/module-protocol-simple.c | 4 +--- src/modules/module-rtp-session.c | 8 ++------ src/modules/module-rtp-source.c | 3 +-- src/modules/module-vban-recv.c | 8 ++++---- 6 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/modules/module-avb/stream.c b/src/modules/module-avb/stream.c index 006ae952e..682c843bf 100644 --- a/src/modules/module-avb/stream.c +++ b/src/modules/module-avb/stream.c @@ -902,7 +902,6 @@ int stream_activate(struct stream *stream, uint16_t index, uint64_t now) if (stream->source == NULL) { res = -errno; pw_log_error("stream %p: can't create source: %m", stream); - close(fd); return res; } } @@ -1017,10 +1016,8 @@ int stream_activate_virtual(struct stream *stream, uint16_t index) stream->source = pw_loop_add_io(server->impl->loop, fd, SPA_IO_IN, true, on_socket_data, stream); - if (stream->source == NULL) { - close(fd); + if (stream->source == NULL) return -errno; - } } pw_stream_set_active(stream->stream, true); return 0; diff --git a/src/modules/module-netjack2-driver.c b/src/modules/module-netjack2-driver.c index d6c206bfc..f7f49561a 100644 --- a/src/modules/module-netjack2-driver.c +++ b/src/modules/module-netjack2-driver.c @@ -1079,7 +1079,6 @@ static int create_netjack2_socket(struct impl *impl) if (impl->setup_socket == NULL) { res = -errno; pw_log_error("can't create setup source: %m"); - close(fd); goto out; } diff --git a/src/modules/module-protocol-simple.c b/src/modules/module-protocol-simple.c index 172debd4e..4bc26574d 100644 --- a/src/modules/module-protocol-simple.c +++ b/src/modules/module-protocol-simple.c @@ -761,12 +761,10 @@ static struct server *create_server(struct impl *impl, const char *address) if (server->source == NULL) { res = -errno; pw_log_error("%p: can't create server source: %m", impl); - goto error_close; + goto error; } return server; -error_close: - close(fd); error: server_free(server); errno = -res; diff --git a/src/modules/module-rtp-session.c b/src/modules/module-rtp-session.c index 54fe9a65c..a82731120 100644 --- a/src/modules/module-rtp-session.c +++ b/src/modules/module-rtp-session.c @@ -1197,10 +1197,8 @@ static int setup_apple_session(struct impl *impl) impl->ctrl_source = pw_loop_add_io(impl->loop, fd, SPA_IO_IN, true, on_ctrl_io, impl); - if (impl->ctrl_source == NULL) { - close(fd); + if (impl->ctrl_source == NULL) return -errno; - } if ((fd = make_socket(&impl->data_addr, impl->data_len, impl->mcast_loop, impl->ttl, impl->ifname)) < 0) @@ -1208,10 +1206,8 @@ static int setup_apple_session(struct impl *impl) impl->data_source = pw_loop_add_io(impl->data_loop, fd, SPA_IO_IN, true, on_data_io, impl); - if (impl->data_source == NULL) { - close(fd); + if (impl->data_source == NULL) return -errno; - } return 0; } diff --git a/src/modules/module-rtp-source.c b/src/modules/module-rtp-source.c index b0b52ed50..72683ca90 100644 --- a/src/modules/module-rtp-source.c +++ b/src/modules/module-rtp-source.c @@ -693,9 +693,8 @@ static void stream_open_connection(void *data, int *result) impl->source = pw_loop_add_io(impl->data_loop, fd, SPA_IO_IN, true, on_rtp_io, impl); if (impl->source == NULL) { - pw_log_error("can't create io source: %m"); - close(fd); res = -errno; + pw_log_error("can't create io source: %m"); goto finish; } diff --git a/src/modules/module-vban-recv.c b/src/modules/module-vban-recv.c index f0733c498..db52c6f48 100644 --- a/src/modules/module-vban-recv.c +++ b/src/modules/module-vban-recv.c @@ -525,7 +525,7 @@ invalid_version: static int listen_start(struct impl *impl) { - int fd; + int fd, res; if (impl->source != NULL) return 0; @@ -534,16 +534,16 @@ static int listen_start(struct impl *impl) if ((fd = make_socket((const struct sockaddr *)&impl->src_addr, impl->src_len, impl->ifname)) < 0) { - pw_log_error("failed to create socket: %m"); + pw_log_error("failed to create socket: %s", spa_strerror(fd)); return fd; } impl->source = pw_loop_add_io(impl->data_loop, fd, SPA_IO_IN, true, on_vban_io, impl); if (impl->source == NULL) { + res = -errno; pw_log_error("can't create io source: %m"); - close(fd); - return -errno; + return res; } return 0; }