From 308c6881c03b6302afd5cc48781d73a11ef994d4 Mon Sep 17 00:00:00 2001 From: Valentine Krasnobaeva Date: Wed, 7 Aug 2024 19:31:09 +0200 Subject: [PATCH] BUG/MINOR: proto_tcp: delete fd from fdtab if listen() fails If listen() fails, fd should be deleted from fdtab, not just closed. Otherwise, sock_inet_bind_receiver(), which is called in loop for each receiver, will obtain the same fd via socket() for the next receiver, registered in the receivers list. Then, it will bind it again and it will try to re-insert it in fdtab, and fd_insert() will trigger the BUG_ON(fdtab[fd].owner != NULL) check. When tcp_bind_listener() code was implemented, the use of fd_delete() was not generalized and this one remained overlooked. This can be backported to all stable versions. --- src/proto_tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proto_tcp.c b/src/proto_tcp.c index faa26de3a..25d66bafd 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -694,7 +694,7 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) tcp_close_return: free_trash_chunk(msg); msg = NULL; - close(fd); + fd_delete(fd); tcp_return: if (msg && errlen && msg->data) { char pn[INET6_ADDRSTRLEN];