Commit ddc1d4d6 authored by Witold Krecicki's avatar Witold Krecicki
Browse files

Fix a race between process_fd and socketclose in unix socket code. [GL #744]

parent 258ea3a8
Pipeline #7621 passed with stages
in 13 minutes and 59 seconds
5105. [bug] Fix a race between process_fd and socketclose in
unix socket code. [GL #744]
5104. [cleanup] Log clearer informational message when a catz zone
is overridden by a zone in named.conf.
Thanks to Tony Finch. [GL !1157]
......
......@@ -473,8 +473,6 @@ static void setdscp(isc__socket_t *sock, isc_dscp_t dscp);
#define SELECT_POKE_CONNECT (-4) /*%< Same as _WRITE */
#define SELECT_POKE_CLOSE (-5)
#define SOCK_DEAD(s) (isc_refcount_current(&((s)->references)) == 0)
/*%
* Shortcut index arrays to get access to statistics counters.
*/
......@@ -3253,11 +3251,15 @@ process_fd(isc__socketthread_t *thread, int fd, bool readable,
UNLOCK(&thread->fdlock[lockid]);
return;
}
if (SOCK_DEAD(sock)) { /* Sock is being closed, bail */
goto unlock_fd;
}
isc_refcount_increment(&sock->references);
if (isc_refcount_increment(&sock->references) == 0) {
/*
* Sock is being closed, it will be destroyed, bail.
*/
isc_refcount_decrement(&sock->references);
UNLOCK(&thread->fdlock[lockid]);
return;
}
if (readable) {
if (sock->listener) {
......@@ -3275,12 +3277,9 @@ process_fd(isc__socketthread_t *thread, int fd, bool readable,
}
}
unlock_fd:
UNLOCK(&thread->fdlock[lockid]);
if (sock != NULL) {
if (isc_refcount_decrement(&sock->references) == 1) {
destroy(&sock);
}
if (isc_refcount_decrement(&sock->references) == 1) {
destroy(&sock);
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment