From e2ba0df2d4798e52e188c2f7f74613867d5aa82a Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 31 May 2013 17:04:25 +0100 Subject: [PATCH] Don't BIND DHCP socket if more interfaces may come along later. --- CHANGELOG | 6 ++++++ src/dhcp-common.c | 20 +++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 31c2ea8..6394107 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -50,6 +50,12 @@ version 2.67 Log when the maximum number of concurrent DNS queries is reached. Thanks to Marcelo Salhab Brogliato for the patch. + If wildcards are used in --interface, don't assume that + there will only ever be one available interface for DHCP + just because there is one at start-up. More may appear, so + we can't use SO_BINDTODEVICE. Thanks to Natrio for the bug + report. + version 2.66 Add the ability to act as an authoritative DNS diff --git a/src/dhcp-common.c b/src/dhcp-common.c index 8de4268..9321e92 100644 --- a/src/dhcp-common.c +++ b/src/dhcp-common.c @@ -347,21 +347,27 @@ void bindtodevice(int fd) to that device. This is for the use case of (eg) OpenStack, which runs a new dnsmasq instance for each VLAN interface it creates. Without the BINDTODEVICE, individual processes don't always see the packets they should. - SO_BINDTODEVICE is only available Linux. */ + SO_BINDTODEVICE is only available Linux. + + Note that if wildcards are used in --interface, or a configured interface doesn't + yet exist, then more interfaces may arrive later, so we can't safely assert there + is only one interface and proceed. +*/ struct irec *iface, *found; - + struct iname *if_tmp; + + for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next) + if (if_tmp->name && (!if_tmp->used || strchr(if_tmp->name, '*'))) + return; + for (found = NULL, iface = daemon->interfaces; iface; iface = iface->next) if (iface->dhcp_ok) { if (!found) found = iface; else if (strcmp(found->name, iface->name) != 0) - { - /* more than one. */ - found = NULL; - break; - } + return; /* more than one. */ } if (found) -- 2.39.5