From 7b753522c0b9fbf9f60fcf2648ffb6a5e5742c88 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 15 Apr 2020 17:26:21 +0000 Subject: Don't enumerate interfaces if no interfaces were found. When dnsmasq receives a list of interfaces, but cannot find any of them (e.g., because they have all been deleted), it enters the default non-Android codepath where it listens on all interfaces. Then, if any of the interfaces on the system is deleted while it is starting up on all interfaces, it can enter a codepath where it gets stuck for 20(!) seconds for DAD to complete on an interface that no longer exists. Bug: 152695206 Test: new test coverage in netd_integration_test Merged-In: Id9289e5a22dddceb53782d75e3caa4f6a88c6fb1 Change-Id: Id9289e5a22dddceb53782d75e3caa4f6a88c6fb1 --- src/network.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/network.c b/src/network.c index 34d821d..98b4f68 100644 --- a/src/network.c +++ b/src/network.c @@ -833,8 +833,11 @@ void set_interfaces(const char* interfaces) { * Enumerate IP addresses (via RTM_GETADDR), adding IP entries to * daemon->interfaces for interface names listed in daemon->if_names. * The sockets are created by the create_bound_listener call below. + * Only do this if at least one interface was found. Otherwise, + * enumerate_interfaces will start listening on all interfaces on + * the system. */ - if (!enumerate_interfaces()) { + if (daemon->if_names != NULL && !enumerate_interfaces()) { die(_("enumerate interfaces error in set_interfaces: %s"), NULL, EC_BADNET); } -- cgit v1.2.3 From 97c6e4a8837a7d1c7f7bdf8b27670db6c72c9cd5 Mon Sep 17 00:00:00 2001 From: chenbruce Date: Thu, 3 Sep 2020 17:16:53 +0800 Subject: =?UTF-8?q?Update=20language=20to=20comply=20with=20Android?= =?UTF-8?q?=E2=80=99s=20inclusive=20language=20guidance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://source.android.com/setup/contribute/respectful-code for reference inclusivefixit Bug: 166529523 Test: m Change-Id: Ib436cde848335813528f49207dee88a92a128929 --- src/dnsmasq.c | 6 +++--- src/helper.c | 4 ++-- src/log.c | 2 +- src/network.c | 2 +- src/util.c | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dnsmasq.c b/src/dnsmasq.c index 27ad864..46d15ee 100644 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -350,10 +350,10 @@ int main(int argc, char** argv) { if (!(daemon->options & OPT_DEBUG) && getuid() == 0) { int bad_capabilities = 0; - gid_t dummy; + gid_t unused; /* remove all supplimentary groups */ - if (gp && (setgroups(0, &dummy) == -1 || setgid(gp->gr_gid) == -1)) { + if (gp && (setgroups(0, &unused) == -1 || setgid(gp->gr_gid) == -1)) { send_event(err_pipe[1], EVENT_GROUP_ERR, errno); _exit(0); } @@ -571,7 +571,7 @@ static void sig_handler(int sig) { /* alarm is used to kill TCP children after a fixed time. */ if (sig == SIGALRM) _exit(0); } else { - /* master process */ + /* main process */ const int errsave = errno; int event; diff --git a/src/helper.c b/src/helper.c index eb6614a..3e414b2 100644 --- a/src/helper.c +++ b/src/helper.c @@ -75,8 +75,8 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) { sigaction(SIGALRM, &sigact, NULL); if (!(daemon->options & OPT_DEBUG) && uid != 0) { - gid_t dummy; - if (setgroups(0, &dummy) == -1 || setgid(gid) == -1 || setuid(uid) == -1) { + gid_t unused; + if (setgroups(0, &unused) == -1 || setgid(gid) == -1 || setuid(uid) == -1) { if (daemon->options & OPT_NO_FORK) /* send error to daemon process if no-fork */ send_event(event_fd, EVENT_HUSER_ERR, errno); else { diff --git a/src/log.c b/src/log.c index d1fcfb9..1cc4745 100644 --- a/src/log.c +++ b/src/log.c @@ -104,7 +104,7 @@ int log_reopen(char* log_file) { return log_fd != -1; } else #if defined(__ANDROID__) -#define _PATH_LOG "" /* dummy */ +#define _PATH_LOG "" /* unused */ log_fd = -1; #else { diff --git a/src/network.c b/src/network.c index 98b4f68..d542c94 100644 --- a/src/network.c +++ b/src/network.c @@ -180,7 +180,7 @@ static int iface_allowed(struct irec** irecp, int if_index, union mysockaddr* ad #ifdef HAVE_IPV6 static int iface_allowed_v6(struct in6_addr* local, int scope, int if_index, void* vparam) { union mysockaddr addr; - struct in_addr netmask; /* dummy */ + struct in_addr netmask; /* unused */ netmask.s_addr = 0; diff --git a/src/util.c b/src/util.c index 53e3137..b188bce 100644 --- a/src/util.c +++ b/src/util.c @@ -266,12 +266,12 @@ int hostname_isequal(char* a, char* b) { time_t dnsmasq_time(void) { #ifdef HAVE_BROKEN_RTC - struct tms dummy; + struct tms unused; static long tps = 0; if (tps == 0) tps = sysconf(_SC_CLK_TCK); - return (time_t)(times(&dummy) / tps); + return (time_t)(times(&unused) / tps); #else return time(NULL); #endif -- cgit v1.2.3