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 <goldsimon@gmx.de>
This commit is contained in:
Patrick Schlangen 2019-12-19 10:40:52 +01:00 committed by Simon Goldschmidt
parent 32a72b1a20
commit 8d7e436a9d

View File

@ -2140,7 +2140,8 @@ lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
(exceptset && FD_ISSET(i, exceptset))) { (exceptset && FD_ISSET(i, exceptset))) {
struct lwip_sock *sock; struct lwip_sock *sock;
SYS_ARCH_PROTECT(lev); 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) { if (sock != NULL) {
/* for now, handle select_waiting==0... */ /* for now, handle select_waiting==0... */
LWIP_ASSERT("sock->select_waiting > 0", sock->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--; sock->select_waiting--;
} }
SYS_ARCH_UNPROTECT(lev); SYS_ARCH_UNPROTECT(lev);
done_socket(sock);
} else { } else {
SYS_ARCH_UNPROTECT(lev); SYS_ARCH_UNPROTECT(lev);
/* Not a valid socket */ /* Not a valid socket */