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;