ncd: синхронный close timed_out-conn чтобы не было коллизии линков при cycle_restart
This commit is contained in:
1 parent
d886a2ff84
commit
e75e3750aa
1 file changed
+8
-1
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user