Files
extra/dnsmasq/0001-Handle-binding-upstream-servers-to-an-interface.patch
2025-06-22 20:39:04 -05:00

70 lines
2.1 KiB
Diff

diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index 1e21005b..c6067f7e 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -544,7 +544,7 @@ struct serverfd {
int fd;
union mysockaddr source_addr;
char interface[IF_NAMESIZE+1];
- unsigned int ifindex, used, preallocated;
+ unsigned int ifindex, used;
struct serverfd *next;
};
diff --git a/src/network.c b/src/network.c
index 3600250b..a2bdf1e3 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1409,11 +1409,15 @@ static struct serverfd *allocate_sfd(union mysockaddr *addr, char *intname, unsi
return NULL;
}
+ if (intname && strlen(intname) != 0)
+ ifindex = if_nametoindex(intname); /* index == 0 when not binding to an interface */
+
/* may have a suitable one already */
for (sfd = daemon->sfds; sfd; sfd = sfd->next )
if (ifindex == sfd->ifindex &&
sockaddr_isequal(&sfd->source_addr, addr) &&
- strcmp(intname, sfd->interface) == 0)
+ strcmp(intname, sfd->interface) == 0 &&
+ ifindex == sfd->ifindex)
return sfd;
/* need to make a new one. */
@@ -1441,7 +1445,6 @@ static struct serverfd *allocate_sfd(union mysockaddr *addr, char *intname, unsi
sfd->source_addr = *addr;
sfd->next = daemon->sfds;
sfd->ifindex = ifindex;
- sfd->preallocated = 0;
daemon->sfds = sfd;
return sfd;
@@ -1465,7 +1468,7 @@ void pre_allocate_sfds(void)
addr.in.sin_len = sizeof(struct sockaddr_in);
#endif
if ((sfd = allocate_sfd(&addr, "", 0)))
- sfd->preallocated = 1;
+ sfd->used = 1;
memset(&addr, 0, sizeof(addr));
addr.in6.sin6_family = AF_INET6;
@@ -1475,7 +1478,7 @@ void pre_allocate_sfds(void)
addr.in6.sin6_len = sizeof(struct sockaddr_in6);
#endif
if ((sfd = allocate_sfd(&addr, "", 0)))
- sfd->preallocated = 1;
+ sfd->used = 1;
}
for (srv = daemon->servers; srv; srv = srv->next)
@@ -1630,7 +1633,7 @@ void check_servers(void)
/* don't garbage collect pre-allocated sfds. */
for (sfd = daemon->sfds; sfd; sfd = sfd->next)
- sfd->used = sfd->preallocated;
+ sfd->used = 0;
for (count = 0, serv = daemon->servers; serv; serv = serv->next)
{