From 63272abe53abeb094240b6b58300476c77a3b174 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 2 Aug 2026 20:38:42 +0300 Subject: [PATCH] chat: fix duplicate v6 address from v4 socket's interface_addr sync_my_addresses used interface_addr even when its family differed from the socket's local_addr family. A v4 socket bound to 0.0.0.0 could pick up a v6 interface_addr on dual-stack Android, inserting a duplicate v6 entry. Now interface_addr is only used when families match. --- src/chat/chat_profile.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chat/chat_profile.c b/src/chat/chat_profile.c index 5c9a47d5..99c2a158 100644 --- a/src/chat/chat_profile.c +++ b/src/chat/chat_profile.c @@ -116,9 +116,10 @@ void chat_core_sync_my_addresses(void) { int sock_count = 0, written = 0; while (sock) { sock_count++; - struct sockaddr_storage* sa = sock->interface_addr.ss_family ? &sock->interface_addr : NULL; + int sock_family = sock->local_addr.ss_family ? sock->local_addr.ss_family : 0; + struct sockaddr_storage* sa = (sock->interface_addr.ss_family == sock_family) ? &sock->interface_addr : NULL; if (!sa) sa = sock->local_addr.ss_family ? &sock->local_addr : NULL; - if (!sa) { DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "%s: [ADDR_SYNC] socket %d — no interface/local addr", CC_ID, sock_count); sock = sock->next; continue; } + if (!sa) { DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "%s: [ADDR_SYNC] socket %d — no address for family=%d", CC_ID, sock_count, sock_family); sock = sock->next; continue; } if (sa->ss_family == AF_INET) { struct sockaddr_in* sin = (struct sockaddr_in*)sa;