From 15ca0675c042b0001d5e8fe0f256fda72ce02c9a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 20 Jul 2026 00:47:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D1=8C:=20pubkey=20check=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20reusing=20=D0=BB=D0=B8=D0=BD=D0=BA=D0=B0=20+=20node=5F?= =?UTF-8?q?changed=20=D0=BF=D1=80=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=84=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D1=82=D0=B5=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=B0?= =?UTF-8?q?=20=D1=87=D1=83=D0=B6=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/etcp_connections.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/etcp_connections.c b/src/etcp_connections.c index f0ef5f58..870d06a7 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -1694,13 +1694,35 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) { struct ETCP_LINK* existing_link = etcp_link_find_by_remote_id(conn, req->link_id); if (!existing_link) { - existing_link = etcp_link_find_by_addr(e_sock, &addr); - if (existing_link && existing_link->etcp == conn) { - DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p", - conn->log_name, existing_link); - } else { - existing_link = NULL; + existing_link = etcp_link_find_by_addr(e_sock, &addr); + if (existing_link && existing_link->etcp == conn) { + if (memcmp(conn->crypto_ctx.peer_public_key, sc.peer_public_key, SC_PUBKEY_SIZE)) { + DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] link address match but pubkey mismatch, firing node_changed", conn->log_name); + DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "pubkey mismatch on reused link for node %016llx", (unsigned long long)peer_id); + conn->callbacks_running = 1; + struct etcp_cbk_entry* cbe = conn->node_changed_cbks; + while (cbe) { struct etcp_cbk_entry* n = cbe->next; cbe->fn(conn, cbe->arg); cbe = n; } + conn->callbacks_running = 0; + errorcode = 67; + goto ec_fr; } + DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p", + conn->log_name, existing_link); + } else if (existing_link) { + struct ETCP_CONN* old_conn = existing_link->etcp; + DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] conflicting link at %s belongs to %s, firing node_changed", + conn->log_name, sockaddr_storage_to_str(&addr).str, old_conn->log_name); + DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "link address conflict for node %016llx, firing node_changed callbacks on %s", + (unsigned long long)peer_id, old_conn->log_name); + old_conn->callbacks_running = 1; + struct etcp_cbk_entry* cbe = old_conn->node_changed_cbks; + while (cbe) { struct etcp_cbk_entry* n = cbe->next; cbe->fn(old_conn, cbe->arg); cbe = n; } + old_conn->callbacks_running = 0; + errorcode = 67; + goto ec_fr; + } else { + existing_link = NULL; + } } uint8_t send_reset = 0;