]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix a race in socket code when internal_{accept, send, receive} is called
authorWitold Kręcicki <wpk@culm.net>
Fri, 15 Feb 2019 10:28:58 +0000 (11:28 +0100)
committerEvan Hunt <each@isc.org>
Wed, 6 Mar 2019 22:15:19 +0000 (14:15 -0800)
from event loop on an socket and, in the meantime, someone has closed this
socket.

(cherry picked from commit b57a38ae433d2bc7bc8c1de70c7d5c47eaa76ccb)

lib/isc/unix/socket.c

index 4a3365cb4747088f5e724b961a9a2be101e5b9e2..00ea6a27cff1e85724000c01b35240cef8008ad8 100644 (file)
@@ -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;