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",