From 7e3250d52921b5f75bdbe0b794514bb78a209969 Mon Sep 17 00:00:00 2001 From: Petr Mensik Date: Wed, 3 Jul 2019 17:02:16 +0200 Subject: [PATCH 2/5] Compare address and interface index for allowed interface If interface is recreated with the same address but different index, it would not change any other parameter. Test also address family on incoming TCP queries. --- src/dnsmasq.c | 3 ++- src/network.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dnsmasq.c b/src/dnsmasq.c index f3d2671..7812be8 100644 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -1667,7 +1667,8 @@ static void check_dns_listeners(time_t now) #endif for (iface = daemon->interfaces; iface; iface = iface->next) - if (iface->index == if_index) + if (iface->index == if_index && + iface->addr.sa.sa_family == tcp_addr.sa.sa_family) break; if (!iface && !loopback_exception(listener->tcpfd, tcp_addr.sa.sa_family, &addr, intr_name)) diff --git a/src/network.c b/src/network.c index fd90288..f247811 100644 --- a/src/network.c +++ b/src/network.c @@ -404,10 +404,11 @@ static int iface_allowed(struct iface_param *param, int if_index, char *label, /* check whether the interface IP has been added already we call this routine multiple times. */ for (iface = daemon->interfaces; iface; iface = iface->next) - if (sockaddr_isequal(&iface->addr, addr)) + if (sockaddr_isequal(&iface->addr, addr) && iface->index == if_index) { iface->dad = !!(iface_flags & IFACE_TENTATIVE); iface->found = 1; /* for garbage collection */ + iface->netmask = netmask; return 1; } -- 2.20.1