]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Move setting the sock->write_timeout to the async_*send
authorOndřej Surý <ondrej@isc.org>
Tue, 17 May 2022 19:31:37 +0000 (21:31 +0200)
committerOndřej Surý <ondrej@isc.org>
Thu, 19 May 2022 20:38:47 +0000 (22:38 +0200)
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)

lib/isc/netmgr/tcp.c
lib/isc/netmgr/tcpdns.c

index a8d1dba6d4afd5cee80ff3ee05af0dcb7d0c6258..eaad8da7c657c3a6fb786ab7dd1283c2b52b4699 100644 (file)
@@ -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]);
index e287f0a2820966c9696b9e4cedf0a025a29e926f..6f513b49ceba2eb6810c2072a63a3eb0ccd59d68 100644 (file)
@@ -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 } };