From e478ec16f99829c7ceabb9f1359203baa9ccbc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Kr=C4=99cicki?= Date: Wed, 3 Oct 2018 20:39:39 +0000 Subject: [PATCH] Fix a race between socket closing and incoming event. --- lib/isc/unix/socket.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 5bb86353ab..9ea29b937d 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -2700,6 +2700,7 @@ isc_socket_attach(isc_socket_t *sock0, isc_socket_t **socketp) { REQUIRE(socketp != NULL && *socketp == NULL); LOCK(&sock->lock); + REQUIRE(sock->references > 0); sock->references++; UNLOCK(&sock->lock); @@ -2743,7 +2744,6 @@ isc_socket_close(isc_socket_t *sock0) { LOCK(&sock->lock); - REQUIRE(sock->references == 1); REQUIRE(sock->fd >= 0 && sock->fd < (int)sock->manager->maxsocks); INSIST(!sock->connecting); @@ -3234,32 +3234,29 @@ process_fd(isc__socketthread_t *thread, int fd, bool readable, unwatch_write = writeable; goto unlock_fd; } + if (SOCK_DEAD(sock)) { /* Sock is being closed, bail */ + UNLOCK(&sock->lock); + UNLOCK(&thread->fdlock[lockid]); + return; + } LOCK(&sock->lock); sock->references++; UNLOCK(&sock->lock); if (readable) { - if (!SOCK_DEAD(sock)) { - if (sock->listener) - internal_accept(sock); - else - internal_recv(sock); - } + if (sock->listener) + internal_accept(sock); + else + internal_recv(sock); unwatch_read = true; } if (writeable) { - if (sock == NULL) { - unwatch_write = true; - goto unlock_fd; - } - if (!SOCK_DEAD(sock)) { - if (sock->connecting) - internal_connect(sock); - else - internal_send(sock); - } + if (sock->connecting) + internal_connect(sock); + else + internal_send(sock); unwatch_write = true; }