From e75e3750aa825486cbf12677b9c94eeea008deb1 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 10 Sep 2026 15:57:07 +0300 Subject: [PATCH] =?UTF-8?q?ncd:=20=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B9=20close=20timed=5Fout-conn=20=D1=87?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BD=D0=B5=20=D0=B1=D1=8B=D0=BB?= =?UTF-8?q?=D0=BE=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B8=D0=B7=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=D0=BA=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20cyc?= =?UTF-8?q?le=5Frestart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/transport_layer/node_conn_direct.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/transport_layer/node_conn_direct.c b/src/transport_layer/node_conn_direct.c index dc6eb536..dae191cd 100644 --- a/src/transport_layer/node_conn_direct.c +++ b/src/transport_layer/node_conn_direct.c @@ -930,7 +930,14 @@ void node_conn_direct_close(struct NODE_CONN_DIRECT* h) { queue_entry_free(conn->conn_queue_entry); conn->conn_queue_entry = NULL; conn->conn_queue = NULL; } - uasync_call_soon(entry->ua, conn, ncd_deferred_close_conn); + /* закрываем conn синхронно чтобы линки сразу ушли из socket->links_queue: + * иначе в том же тике новый open того же узла создаст дубль-conn и коллизию адресов. + * u_free(conn) всё равно отложен (phase 2 в etcp_connection_close), UAF нет. */ + DEBUG_INFO(DEBUG_CATEGORY_NCD, "[ncd] close: node=0x%016llx state=%d timed_out=%d cb_running=%d -> %s", + (unsigned long long)node_id, conn->state, entry->timed_out, conn->callbacks_running, + conn->callbacks_running ? "deferred" : "sync"); + if (conn->callbacks_running) uasync_call_soon(entry->ua, conn, ncd_deferred_close_conn); + else etcp_connection_close(conn); ncd_registry_remove(conn->instance, entry); u_free(entry); DEBUG_INFO(DEBUG_CATEGORY_NCD, "[ncd] close: conn never came up, immediate cleanup node=0x%016llx",