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