Browse Source

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.
topo_upd
evgeny 2 months ago
parent
commit
63272abe53
  1. 5
      src/chat/chat_profile.c

5
src/chat/chat_profile.c

@ -116,9 +116,10 @@ void chat_core_sync_my_addresses(void) {
int sock_count = 0, written = 0; int sock_count = 0, written = 0;
while (sock) { while (sock) {
sock_count++; 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) 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) { if (sa->ss_family == AF_INET) {
struct sockaddr_in* sin = (struct sockaddr_in*)sa; struct sockaddr_in* sin = (struct sockaddr_in*)sa;

Loading…
Cancel
Save