From 8d7e436a9d24a2a1ee35aac72a7055e80330e994 Mon Sep 17 00:00:00 2001 From: Patrick Schlangen Date: Thu, 19 Dec 2019 10:40:52 +0100 Subject: [PATCH] Fix select_waiting not being decremented for sockets closed while in lwip_select() See bug #57445. Short version of the description there: lwip_select() failed to decrement 'select_waiting' of a socket since that code part failed on 'free_pending' sockets. However, the code does not have to check that as it has marked the socket to be in use itself earlier. Signed-off-by: Simon Goldschmidt --- src/api/sockets.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index 20819718..813e3e44 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -2140,7 +2140,8 @@ lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, (exceptset && FD_ISSET(i, exceptset))) { struct lwip_sock *sock; SYS_ARCH_PROTECT(lev); - sock = tryget_socket_unconn_locked(i); + sock = tryget_socket_unconn_nouse(i); + LWIP_ASSERT("socket gone at the end of select", sock != NULL); if (sock != NULL) { /* for now, handle select_waiting==0... */ LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0); @@ -2148,7 +2149,6 @@ lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, sock->select_waiting--; } SYS_ARCH_UNPROTECT(lev); - done_socket(sock); } else { SYS_ARCH_UNPROTECT(lev); /* Not a valid socket */