From: Mark Andrews Date: Wed, 26 Aug 2020 07:52:55 +0000 (+1000) Subject: It appears that you can't change what you are polling for while connecting. X-Git-Tag: v9.11.24~30^2~18 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=cf4a9d9ab87d572404e39177ee240c7618831982;p=thirdparty%2Fbind9.git It appears that you can't change what you are polling for while connecting. WARNING: ThreadSanitizer: data race (pid=6465) Read of size 8 at 0x7ba000002040 by thread T14: #0 epoll_ctl (named+0x44ccd2) #1 watch_fd /builds/isc-projects/bind9/lib/isc/unix/socket.c:975:8 (libisc.so.1107+0x6bd90) #2 wakeup_socket /builds/isc-projects/bind9/lib/isc/unix/socket.c:1164:11 (libisc.so.1107+0x7057d) #3 process_ctlfd /builds/isc-projects/bind9/lib/isc/unix/socket.c:4258:3 (libisc.so.1107+0x6c308) #4 process_fds /builds/isc-projects/bind9/lib/isc/unix/socket.c:4162:10 (libisc.so.1107+0x6bf74) #5 watcher /builds/isc-projects/bind9/lib/isc/unix/socket.c:4401:10 (libisc.so.1107+0x64348) Previous write of size 8 at 0x7ba000002040 by thread T9 (mutexes: write M81481868977181736): #0 connect (named+0x44b7e0) #1 isc__socket_connect /builds/isc-projects/bind9/lib/isc/unix/socket.c:5902:7 (libisc.so.1107+0x67a79) #2 isc_socket_connect /builds/isc-projects/bind9/lib/isc/unix/./../socket_api.c:169:11 (libisc.so.1107+0x6aa4b) #3 resquery_send /builds/isc-projects/bind9/lib/dns/resolver.c:2573:13 (libdns.so.1110+0x18570b) #4 fctx_query /builds/isc-projects/bind9/lib/dns/resolver.c:1903:12 (libdns.so.1110+0x1815a3) #5 fctx_try /builds/isc-projects/bind9/lib/dns/resolver.c:3863:11 (libdns.so.1110+0x17e3a9) #6 fctx_start /builds/isc-projects/bind9/lib/dns/resolver.c:4219:4 (libdns.so.1110+0x178833) #7 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507f5) #8 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d749) Location is file descriptor 516 created by thread T9 at: #0 connect (named+0x44b7e0) #1 isc__socket_connect /builds/isc-projects/bind9/lib/isc/unix/socket.c:5902:7 (libisc.so.1107+0x67a79) #2 isc_socket_connect /builds/isc-projects/bind9/lib/isc/unix/./../socket_api.c:169:11 (libisc.so.1107+0x6aa4b) #3 resquery_send /builds/isc-projects/bind9/lib/dns/resolver.c:2573:13 (libdns.so.1110+0x18570b) #4 fctx_query /builds/isc-projects/bind9/lib/dns/resolver.c:1903:12 (libdns.so.1110+0x1815a3) #5 fctx_try /builds/isc-projects/bind9/lib/dns/resolver.c:3863:11 (libdns.so.1110+0x17e3a9) #6 fctx_start /builds/isc-projects/bind9/lib/dns/resolver.c:4219:4 (libdns.so.1110+0x178833) #7 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507f5) #8 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d749) --- diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 0ebdf4c3453..692f3d83f9b 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -967,12 +967,18 @@ watch_fd(isc__socketmgr_t *manager, int fd, int msg) { manager->epoll_events[fd] |= EPOLLOUT; event.events = manager->epoll_events[fd]; - UNLOCK(&manager->fdlock[lockid]); memset(&event.data, 0, sizeof(event.data)); event.data.fd = fd; op = (oldevents == 0U) ? EPOLL_CTL_ADD : EPOLL_CTL_MOD; + if (manager->fds[fd] != NULL) { + LOCK(&manager->fds[fd]->lock); + } ret = epoll_ctl(manager->epoll_fd, op, fd, &event); + if (manager->fds[fd] != NULL) { + UNLOCK(&manager->fds[fd]->lock); + } + UNLOCK(&manager->fdlock[lockid]); if (ret == -1) { if (errno == EEXIST) UNEXPECTED_ERROR(__FILE__, __LINE__,