70 lines
3.6 KiB
Diff
70 lines
3.6 KiB
Diff
From cf4a9d9ab87d572404e39177ee240c7618831982 Mon Sep 17 00:00:00 2001
|
|
From: Mark Andrews <marka@isc.org>
|
|
Date: Wed, 26 Aug 2020 17:52:55 +1000
|
|
Subject: [PATCH] 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 <null> (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 <null> (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 <null> (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)
|
|
Conflict: NA
|
|
Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/cf4a9d9ab87d572404e39177ee240c7618831982
|
|
---
|
|
lib/isc/unix/socket.c | 8 +++++++-
|
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c
|
|
index 0ebdf4c345..692f3d83f9 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__,
|
|
--
|
|
2.23.0
|
|
|