From 8c43d83689cb45b4f74f57fb1c78ba2db576775c 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 2d231739..232a8343 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -2101,7 +2101,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); @@ -2109,7 +2110,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 */