From 9243e6d9358675e23df312b8619d6dfafe04a2b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Fri, 18 Sep 2020 14:10:15 +0200 Subject: [PATCH] fixup! Clone the csock in accept_connection(), not in callback --- lib/isc/netmgr/netmgr-int.h | 1 + lib/isc/netmgr/netmgr.c | 2 +- lib/isc/netmgr/tcp.c | 11 ++++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index d74170ffa4..78363a8cc0 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -411,6 +411,7 @@ struct isc_nmsocket { */ uv_timer_t timer; bool timer_initialized; + bool timer_running; uint64_t read_timeout; uint64_t connect_timeout; bool timed_out; diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index af9fcb0904..c32fd44807 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -1052,7 +1052,7 @@ isc__nmsocket_init(isc_nmsocket_t *sock, isc_nm_t *mgr, isc_nmsocket_type type, void isc__nmsocket_clearcb(isc_nmsocket_t *sock) { REQUIRE(VALID_NMSOCK(sock)); - REQUIRE(sock->tid == isc_nm_tid()); + REQUIRE(!isc__nm_in_netthread() || sock->tid == isc_nm_tid()); sock->recv_cb = NULL; sock->recv_cbarg = NULL; diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 5b7e7e4b6a..d01089737d 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -86,7 +86,7 @@ connecttimeout_cb(uv_timer_t *handle) { } uv_timer_stop(&sock->timer); - sock->timer_initialized = false; + sock->timer_running = false; sock->timed_out = true; isc__nm_uvreq_put(&req, sock); isc__nmsocket_detach(&sock); @@ -109,6 +109,7 @@ tcp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) { uv_timer_start(&sock->timer, connecttimeout_cb, sock->connect_timeout, 0); + sock->timer_running = true; r = uv_tcp_init(&worker->loop, &sock->uv_handle.tcp); if (r != 0) { @@ -185,7 +186,7 @@ tcp_connect_cb(uv_connect_t *uvreq, int status) { } uv_timer_stop(&sock->timer); - sock->timer_initialized = false; + sock->timer_running = false; if (status != 0) { req->cb.connect(NULL, isc__nm_uverr2result(status), req->cbarg); @@ -720,6 +721,7 @@ isc__nm_async_tcp_startread(isc__networker_t *worker, isc__netievent_t *ev0) { } uv_timer_start(&sock->timer, readtimeout_cb, sock->read_timeout, 0); + sock->timer_running = true; } r = uv_read_start(&sock->uv_handle.stream, tcp_alloc_cb, read_cb); @@ -762,8 +764,9 @@ isc__nm_async_tcp_pauseread(isc__networker_t *worker, isc__netievent_t *ev0) { REQUIRE(VALID_NMSOCK(sock)); REQUIRE(worker->id == isc_nm_tid()); - if (sock->timer_initialized) { + if (sock->timer_running) { uv_timer_stop(&sock->timer); + sock->timer_running = false; } uv_read_stop(&sock->uv_handle.stream); } @@ -1139,7 +1142,9 @@ tcp_close_direct(isc_nmsocket_t *sock) { } if (sock->timer_initialized) { sock->timer_initialized = false; + sock->timer_running = false; uv_timer_stop(&sock->timer); + uv_handle_set_data((uv_handle_t *)&sock->timer, sock); uv_close((uv_handle_t *)&sock->timer, timer_close_cb); } else { if (sock->server != NULL) {