Browse Source

ncd: синхронный close timed_out-conn чтобы не было коллизии линков при cycle_restart

v2
evgeny 3 weeks ago
parent
commit
e75e3750aa
  1. 9
      src/transport_layer/node_conn_direct.c

9
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); queue_entry_free(conn->conn_queue_entry);
conn->conn_queue_entry = NULL; conn->conn_queue = NULL; 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); ncd_registry_remove(conn->instance, entry);
u_free(entry); u_free(entry);
DEBUG_INFO(DEBUG_CATEGORY_NCD, "[ncd] close: conn never came up, immediate cleanup node=0x%016llx", DEBUG_INFO(DEBUG_CATEGORY_NCD, "[ncd] close: conn never came up, immediate cleanup node=0x%016llx",

Loading…
Cancel
Save