Merge branch '744-race-in-socket' into 'master'

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

Closes #744

See merge request isc-projects/bind9!1145
This commit is contained in:
Witold Krecicki 2018-12-05 07:19:32 -05:00
commit 43be6ff428
2 changed files with 13 additions and 11 deletions

View file

@ -1,3 +1,6 @@
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]

View file

@ -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);
}
}