From: Witold Kręcicki Date: Fri, 15 Feb 2019 10:28:58 +0000 (+0100) Subject: Fix a race in socket code when internal_{accept, send, receive} is called X-Git-Tag: v9.15.0~120^2~1 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=b57a38ae433d2bc7bc8c1de70c7d5c47eaa76ccb;p=thirdparty%2Fbind9.git Fix a race in socket code when internal_{accept, send, receive} is called from event loop on an socket and, in the meantime, someone has closed this socket. --- diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 4a3365cb474..00ea6a27cff 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -2816,6 +2816,11 @@ internal_accept(isc__socket_t *sock) { INSIST(VALID_SOCKET(sock)); LOCK(&sock->lock); + if (sock->fd < 0) { + /* Socket is gone */ + UNLOCK(&sock->lock); + return; + } socket_log(sock, NULL, TRACE, "internal_accept called, locked socket"); @@ -3051,6 +3056,11 @@ internal_recv(isc__socket_t *sock) { INSIST(VALID_SOCKET(sock)); LOCK(&sock->lock); + if (sock->fd < 0) { + /* Socket is gone */ + UNLOCK(&sock->lock); + return; + } dev = ISC_LIST_HEAD(sock->recv_list); if (dev == NULL) { goto finish; @@ -3105,6 +3115,11 @@ internal_send(isc__socket_t *sock) { INSIST(VALID_SOCKET(sock)); LOCK(&sock->lock); + if (sock->fd < 0) { + /* Socket is gone */ + UNLOCK(&sock->lock); + return; + } dev = ISC_LIST_HEAD(sock->send_list); if (dev == NULL) { goto finish;