]> 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:37:52 +0000 (22:37 +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
lib/isc/netmgr/tlsdns.c

index ad74cb05cb06be47f0962cb71dbe2a64c9d542fc..b8358f4cbc66a45d5618b147782b32858e4dd8bf 100644 (file)
@@ -1065,13 +1065,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);
@@ -1116,6 +1109,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, STATID_SENDFAIL);
index 18ce2d300f22cc859f644f31c12b170ad1c3a66f..779b42301a626d1e872a0c8dbc0311be421e30a4 100644 (file)
@@ -1090,13 +1090,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);
@@ -1149,6 +1142,13 @@ isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
        sock = ievent->sock;
        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 } };
index d0f7922e89627289837ab7385ad0b3a40ab91dd2..1f9881c10ca221b7a6e44b858f6ea53fc61fb5bb 100644 (file)
@@ -1675,13 +1675,6 @@ isc__nm_tlsdns_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_tlsdnssend(sock->mgr, sock, uvreq);
        isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
                               (isc__netievent_t *)ievent);
@@ -1704,6 +1697,13 @@ isc__nm_async_tlsdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
        REQUIRE(sock->type == isc_nm_tlsdnssocket);
        REQUIRE(sock->tid == isc_nm_tid());
 
+       if (sock->write_timeout == 0) {
+               sock->write_timeout =
+                       (atomic_load(&sock->keepalive)
+                                ? atomic_load(&sock->mgr->keepalive)
+                                : atomic_load(&sock->mgr->idle));
+       }
+
        result = tlsdns_send_direct(sock, uvreq);
        if (result != ISC_R_SUCCESS) {
                isc__nm_incstats(sock, STATID_SENDFAIL);