From 63cc2bf0494f25da5cb58f90ce1f84dc7d4d56b0 Mon Sep 17 00:00:00 2001 From: Egor Date: Mon, 17 Mar 2025 19:33:53 +0200 Subject: [PATCH] netpoll: close sockets in the uv_close callback --- src/main.cpp | 3 +-- src/net.cpp | 3 +-- src/netpoll.cpp | 13 +++++++++---- src/netpoll.h | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e5cb301..0f1dd15 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -300,8 +300,7 @@ int main(int argc, char *argv[]) if (is_siginted) { fprintf(stderr, "[PatchyIRCD]: Cleaning up...\n"); for (int i = 0; i < listener_count; i++) { - net_poll_del(listeners[i].sock); - closesocket(listeners[i].sock); + net_poll_del_and_close(listeners[i].sock); } listener_count = 0; for (struct client_data *cl = clients; cl;) { diff --git a/src/net.cpp b/src/net.cpp index 78d0fab..b8b2fa9 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -112,8 +112,7 @@ void killConnectionPart2(struct client_data *cl) } #endif shutdown(cl->FD, SHUT_RDWR); - net_poll_del(cl->FD); - closesocket(cl->FD); + net_poll_del_and_close(cl->FD); } /* Remove the client from the dyingclients chain */ for (struct client_data **next = &dyingclients; *next; next = &(*next)->next) { diff --git a/src/netpoll.cpp b/src/netpoll.cpp index 545a969..aae80a6 100644 --- a/src/netpoll.cpp +++ b/src/netpoll.cpp @@ -281,7 +281,9 @@ static void net_poll_del_impl(int i) struct polldata *poll = uvpoll[i]; memmove(uvpoll+i, uvpoll+i+1, sizeof(uvpoll[0])*(nfds-(i+1))); uv_close((uv_handle_t *)&poll->uv, [](uv_handle_t *handle){ - uvalloc::put(container_of(handle, struct polldata, uv)); + struct polldata *p = container_of(handle, struct polldata, uv); + closesocket(p->fd); + uvalloc::put(p); }); if (lastptr > i) lastptr--; @@ -370,15 +372,15 @@ void net_poll_add(SOCKET fd, int type, void *assoc) REF(fds[i]) = (struct net_pollfd){ .assoc = assoc, .fd = fd, .type = type }; net_poll_add_impl(i); } -void net_poll_del(SOCKET fd) +void net_poll_del_and_close(SOCKET fd) { if (fd == INVALID_SOCKET) { - fprintf(stderr, "net_poll_del: INVALID_SOCKET\n"); + fprintf(stderr, "net_poll_del_and_close: INVALID_SOCKET\n"); abort(); } int i = search(fd); if (!IS_FOUND(i, fd)) { - fprintf(stderr, "net_poll_del: socket not added\n"); + fprintf(stderr, "net_poll_del_and_close: socket not added\n"); abort(); } net_poll_reg_impl(i, 0); @@ -387,6 +389,9 @@ void net_poll_del(SOCKET fd) memmove(fds+i, fds+i+1, sizeof(fds[0])*(nfds-(i+1))); nfds--; fds[nfds] = t; +#ifndef NETPOLL_USE_LIBUV + closesocket(fd); +#endif } void net_poll_reg(SOCKET fd, int ev) { diff --git a/src/netpoll.h b/src/netpoll.h index 4a92d44..e4420ec 100644 --- a/src/netpoll.h +++ b/src/netpoll.h @@ -9,7 +9,7 @@ struct net_pollfd { void net_poll_init(void); void net_poll_fini(void); void net_poll_add(SOCKET fd, int type, void *assoc); -void net_poll_del(SOCKET fd); +void net_poll_del_and_close(SOCKET fd); void net_poll_reg(SOCKET fd, int ev); void net_poll_change_type(SOCKET fd, int type); int net_poll_begin(void); -- 2.56.0