mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
Fix crash when DNS disabled, introduced in 416390f996
This commit is contained in:
@@ -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,6 +1047,8 @@ int main (int argc, char **argv)
|
|||||||
pid = getpid();
|
pid = getpid();
|
||||||
|
|
||||||
daemon->pipe_to_parent = -1;
|
daemon->pipe_to_parent = -1;
|
||||||
|
|
||||||
|
if (daemon->port != 0)
|
||||||
for (i = 0; i < daemon->max_procs; i++)
|
for (i = 0; i < daemon->max_procs; i++)
|
||||||
daemon->tcp_pipes[i] = -1;
|
daemon->tcp_pipes[i] = -1;
|
||||||
|
|
||||||
@@ -1070,8 +1073,13 @@ int main (int argc, char **argv)
|
|||||||
(timeout == -1 || timeout > 1000))
|
(timeout == -1 || timeout > 1000))
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
|
|
||||||
|
if (daemon->port != 0)
|
||||||
set_dns_listeners();
|
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))
|
||||||
set_dbus_listeners();
|
set_dbus_listeners();
|
||||||
@@ -1256,6 +1264,7 @@ int main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (daemon->port != 0)
|
||||||
check_dns_listeners(now);
|
check_dns_listeners(now);
|
||||||
|
|
||||||
#ifdef HAVE_TFTP
|
#ifdef HAVE_TFTP
|
||||||
@@ -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,6 +1596,7 @@ 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. */
|
||||||
|
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] != 0)
|
if (daemon->tcp_pids[i] != 0)
|
||||||
kill(daemon->tcp_pids[i], SIGALRM);
|
kill(daemon->tcp_pids[i], SIGALRM);
|
||||||
@@ -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);
|
||||||
|
if (daemon->port != 0)
|
||||||
set_dns_listeners();
|
set_dns_listeners();
|
||||||
|
#ifdef HAVE_TFTP
|
||||||
|
set_tftp_listeners();
|
||||||
|
#endif
|
||||||
set_log_writer();
|
set_log_writer();
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
@@ -2156,6 +2169,7 @@ 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);
|
||||||
|
if (daemon->port != 0)
|
||||||
check_dns_listeners(now);
|
check_dns_listeners(now);
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user