Fix crash when DNS disabled, introduced in 416390f996

This commit is contained in:
Simon Kelley
2023-11-10 23:13:46 +00:00
parent 416390f996
commit 77ef9b2603
2 changed files with 48 additions and 29 deletions

View File

@@ -30,6 +30,7 @@ static volatile pid_t pid = 0;
static volatile int pipewrite; static volatile int pipewrite;
static void set_dns_listeners(void); static void set_dns_listeners(void);
static void set_tftp_listeners(void);
static void check_dns_listeners(time_t now); static void check_dns_listeners(time_t now);
static void sig_handler(int sig); static void sig_handler(int sig);
static void async_event(int pipe, time_t now); static void async_event(int pipe, time_t now);
@@ -1046,8 +1047,10 @@ int main (int argc, char **argv)
pid = getpid(); pid = getpid();
daemon->pipe_to_parent = -1; daemon->pipe_to_parent = -1;
for (i = 0; i < daemon->max_procs; i++)
daemon->tcp_pipes[i] = -1; if (daemon->port != 0)
for (i = 0; i < daemon->max_procs; i++)
daemon->tcp_pipes[i] = -1;
#ifdef HAVE_INOTIFY #ifdef HAVE_INOTIFY
/* Using inotify, have to select a resolv file at startup */ /* Using inotify, have to select a resolv file at startup */
@@ -1070,7 +1073,12 @@ int main (int argc, char **argv)
(timeout == -1 || timeout > 1000)) (timeout == -1 || timeout > 1000))
timeout = 1000; timeout = 1000;
set_dns_listeners(); if (daemon->port != 0)
set_dns_listeners();
#ifdef HAVE_TFTP
set_tftp_listeners();
#endif
#ifdef HAVE_DBUS #ifdef HAVE_DBUS
if (option_bool(OPT_DBUS)) if (option_bool(OPT_DBUS))
@@ -1256,7 +1264,8 @@ int main (int argc, char **argv)
} }
#endif #endif
check_dns_listeners(now); if (daemon->port != 0)
check_dns_listeners(now);
#ifdef HAVE_TFTP #ifdef HAVE_TFTP
check_tftp_listeners(now); check_tftp_listeners(now);
@@ -1522,7 +1531,7 @@ static void async_event(int pipe, time_t now)
if (errno != EINTR) if (errno != EINTR)
break; break;
} }
else else if (daemon->port != 0)
for (i = 0 ; i < daemon->max_procs; i++) for (i = 0 ; i < daemon->max_procs; i++)
if (daemon->tcp_pids[i] == p) if (daemon->tcp_pids[i] == p)
daemon->tcp_pids[i] = 0; daemon->tcp_pids[i] = 0;
@@ -1587,9 +1596,10 @@ static void async_event(int pipe, time_t now)
case EVENT_TERM: case EVENT_TERM:
/* Knock all our children on the head. */ /* Knock all our children on the head. */
for (i = 0; i < daemon->max_procs; i++) if (daemon->port != 0)
if (daemon->tcp_pids[i] != 0) for (i = 0; i < daemon->max_procs; i++)
kill(daemon->tcp_pids[i], SIGALRM); if (daemon->tcp_pids[i] != 0)
kill(daemon->tcp_pids[i], SIGALRM);
#if defined(HAVE_SCRIPT) && defined(HAVE_DHCP) #if defined(HAVE_SCRIPT) && defined(HAVE_DHCP)
/* handle pending lease transitions */ /* handle pending lease transitions */
@@ -1734,24 +1744,34 @@ void clear_cache_and_reload(time_t now)
#endif #endif
} }
static void set_dns_listeners(void)
{
struct serverfd *serverfdp;
struct listener *listener;
struct randfd_list *rfl;
int i;
#ifdef HAVE_TFTP #ifdef HAVE_TFTP
static void set_tftp_listeners(void)
{
int tftp = 0; int tftp = 0;
struct tftp_transfer *transfer; struct tftp_transfer *transfer;
struct listener *listener;
if (!option_bool(OPT_SINGLE_PORT)) if (!option_bool(OPT_SINGLE_PORT))
for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next) for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next)
{ {
tftp++; tftp++;
poll_listen(transfer->sockfd, POLLIN); poll_listen(transfer->sockfd, POLLIN);
} }
for (listener = daemon->listeners; listener; listener = listener->next)
/* tftp == 0 in single-port mode. */
if (tftp <= daemon->tftp_max && listener->tftpfd != -1)
poll_listen(listener->tftpfd, POLLIN);
}
#endif #endif
static void set_dns_listeners(void)
{
struct serverfd *serverfdp;
struct listener *listener;
struct randfd_list *rfl;
int i;
for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next) for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
poll_listen(serverfdp->fd, POLLIN); poll_listen(serverfdp->fd, POLLIN);
@@ -1779,12 +1799,6 @@ static void set_dns_listeners(void)
we'll be called again when a slot becomes available. */ we'll be called again when a slot becomes available. */
if (listener->tcpfd != -1 && i >= 0) if (listener->tcpfd != -1 && i >= 0)
poll_listen(listener->tcpfd, POLLIN); poll_listen(listener->tcpfd, POLLIN);
#ifdef HAVE_TFTP
/* tftp == 0 in single-port mode. */
if (tftp <= daemon->tftp_max && listener->tftpfd != -1)
poll_listen(listener->tftpfd, POLLIN);
#endif
} }
if (!option_bool(OPT_DEBUG)) if (!option_bool(OPT_DEBUG))
@@ -1837,11 +1851,6 @@ static void check_dns_listeners(time_t now)
if (listener->fd != -1 && poll_check(listener->fd, POLLIN)) if (listener->fd != -1 && poll_check(listener->fd, POLLIN))
receive_query(listener, now); receive_query(listener, now);
#ifdef HAVE_TFTP
if (listener->tftpfd != -1 && poll_check(listener->tftpfd, POLLIN))
tftp_request(listener, now);
#endif
/* check to see if we have a free tcp process slot. /* check to see if we have a free tcp process slot.
Note that we can't assume that because we had Note that we can't assume that because we had
at least one a poll() time, that we still do. at least one a poll() time, that we still do.
@@ -2138,7 +2147,11 @@ int delay_dhcp(time_t start, int sec, int fd, uint32_t addr, unsigned short id)
poll_reset(); poll_reset();
if (fd != -1) if (fd != -1)
poll_listen(fd, POLLIN); poll_listen(fd, POLLIN);
set_dns_listeners(); if (daemon->port != 0)
set_dns_listeners();
#ifdef HAVE_TFTP
set_tftp_listeners();
#endif
set_log_writer(); set_log_writer();
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
@@ -2156,7 +2169,8 @@ int delay_dhcp(time_t start, int sec, int fd, uint32_t addr, unsigned short id)
now = dnsmasq_time(); now = dnsmasq_time();
check_log_writer(0); check_log_writer(0);
check_dns_listeners(now); if (daemon->port != 0)
check_dns_listeners(now);
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
if (daemon->doing_ra && poll_check(daemon->icmp6fd, POLLIN)) if (daemon->doing_ra && poll_check(daemon->icmp6fd, POLLIN))

View File

@@ -585,8 +585,13 @@ static struct tftp_file *check_tftp_fileperm(ssize_t *len, char *prefix, char *c
void check_tftp_listeners(time_t now) void check_tftp_listeners(time_t now)
{ {
struct listener *listener;
struct tftp_transfer *transfer, *tmp, **up; struct tftp_transfer *transfer, *tmp, **up;
for (listener = daemon->listeners; listener; listener = listener->next)
if (listener->tftpfd != -1 && poll_check(listener->tftpfd, POLLIN))
tftp_request(listener, now);
/* In single port mode, all packets come via port 69 and tftp_request() */ /* In single port mode, all packets come via port 69 and tftp_request() */
if (!option_bool(OPT_SINGLE_PORT)) if (!option_bool(OPT_SINGLE_PORT))
for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next) for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next)