89 lines
3.2 KiB
Diff
89 lines
3.2 KiB
Diff
|
|
From ed4eda5ebc77c08b7ef1e6c94bea373c00c903c8 Mon Sep 17 00:00:00 2001
|
||
|
|
From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= <ondrej@isc.org>
|
||
|
|
Date: Tue, 17 May 2022 21:31:37 +0200
|
||
|
|
Subject: [PATCH] Move setting the sock->write_timeout to the async_*send
|
||
|
|
|
||
|
|
Setting the sock->write_timeout from the TCP, TCPDNS, and TLSDNS send
|
||
|
|
functions could lead to (harmless) data race when setting the value for
|
||
|
|
the first time when the isc_nm_send() function would be called from
|
||
|
|
thread not-matching the socket we are sending to. Move the setting the
|
||
|
|
sock->write_timeout to the matching async function which is always
|
||
|
|
called from the matching thread.
|
||
|
|
|
||
|
|
(cherry picked from commit 61117840c18778e69e3073cc01dbea579271a014)
|
||
|
|
Conflict: NA
|
||
|
|
Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/ed4eda5ebc77c08b7ef1e6c94bea373c00c903c8
|
||
|
|
---
|
||
|
|
lib/isc/netmgr/tcp.c | 14 +++++++-------
|
||
|
|
lib/isc/netmgr/tcpdns.c | 15 ++++++++-------
|
||
|
|
2 files changed, 15 insertions(+), 14 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c
|
||
|
|
index a8d1dba6d4..eaad8da7c6 100644
|
||
|
|
--- a/lib/isc/netmgr/tcp.c
|
||
|
|
+++ b/lib/isc/netmgr/tcp.c
|
||
|
|
@@ -1083,13 +1083,6 @@ isc__nm_tcp_send(isc_nmhandle_t *handle, const isc_region_t *region,
|
||
|
|
uvreq->cb.send = cb;
|
||
|
|
uvreq->cbarg = cbarg;
|
||
|
|
|
||
|
|
- if (sock->write_timeout == 0) {
|
||
|
|
- sock->write_timeout =
|
||
|
|
- (atomic_load(&sock->keepalive)
|
||
|
|
- ? atomic_load(&sock->mgr->keepalive)
|
||
|
|
- : atomic_load(&sock->mgr->idle));
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
ievent = isc__nm_get_netievent_tcpsend(sock->mgr, sock, uvreq);
|
||
|
|
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
|
||
|
|
(isc__netievent_t *)ievent);
|
||
|
|
@@ -1134,6 +1127,13 @@ isc__nm_async_tcpsend(isc__networker_t *worker, isc__netievent_t *ev0) {
|
||
|
|
REQUIRE(sock->tid == isc_nm_tid());
|
||
|
|
UNUSED(worker);
|
||
|
|
|
||
|
|
+ if (sock->write_timeout == 0) {
|
||
|
|
+ sock->write_timeout =
|
||
|
|
+ (atomic_load(&sock->keepalive)
|
||
|
|
+ ? atomic_load(&sock->mgr->keepalive)
|
||
|
|
+ : atomic_load(&sock->mgr->idle));
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
result = tcp_send_direct(sock, uvreq);
|
||
|
|
if (result != ISC_R_SUCCESS) {
|
||
|
|
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_SENDFAIL]);
|
||
|
|
diff --git a/lib/isc/netmgr/tcpdns.c b/lib/isc/netmgr/tcpdns.c
|
||
|
|
index e287f0a282..6f513b49ce 100644
|
||
|
|
--- a/lib/isc/netmgr/tcpdns.c
|
||
|
|
+++ b/lib/isc/netmgr/tcpdns.c
|
||
|
|
@@ -1088,13 +1088,6 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region,
|
||
|
|
uvreq->cb.send = cb;
|
||
|
|
uvreq->cbarg = cbarg;
|
||
|
|
|
||
|
|
- if (sock->write_timeout == 0) {
|
||
|
|
- sock->write_timeout =
|
||
|
|
- (atomic_load(&sock->keepalive)
|
||
|
|
- ? atomic_load(&sock->mgr->keepalive)
|
||
|
|
- : atomic_load(&sock->mgr->idle));
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
ievent = isc__nm_get_netievent_tcpdnssend(sock->mgr, sock, uvreq);
|
||
|
|
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
|
||
|
|
(isc__netievent_t *)ievent);
|
||
|
|
@@ -1141,6 +1134,14 @@ isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
|
||
|
|
isc_result_t result;
|
||
|
|
isc_nmsocket_t *sock = ievent->sock;
|
||
|
|
isc__nm_uvreq_t *uvreq = ievent->req;
|
||
|
|
+
|
||
|
|
+ if (sock->write_timeout == 0) {
|
||
|
|
+ sock->write_timeout =
|
||
|
|
+ (atomic_load(&sock->keepalive)
|
||
|
|
+ ? atomic_load(&sock->mgr->keepalive)
|
||
|
|
+ : atomic_load(&sock->mgr->idle));
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
uv_buf_t bufs[2] = { { .base = uvreq->tcplen, .len = 2 },
|
||
|
|
{ .base = uvreq->uvbuf.base,
|
||
|
|
.len = uvreq->uvbuf.len } };
|
||
|
|
--
|
||
|
|
2.23.0
|
||
|
|
|