Fix a race between socket closing and incoming event.

This commit is contained in:
Witold Kręcicki
2018-11-13 19:02:36 +00:00
parent d15ba6eaba
commit e478ec16f9
+14 -17
View File
@@ -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;
}