Fix crash when DNS disabled, introduced in 416390f9962e455769aa8ab6df0e105cae07ae55
authorSimon Kelley <simon@thekelleys.org.uk>
Fri, 10 Nov 2023 23:13:46 +0000 (23:13 +0000)
committerSimon Kelley <simon@thekelleys.org.uk>
Fri, 10 Nov 2023 23:13:46 +0000 (23:13 +0000)
src/dnsmasq.c
src/tftp.c

index 112dbe5..65ba334 100644 (file)
@@ -30,6 +30,7 @@ static volatile pid_t pid = 0;
 static volatile int pipewrite;
 
 static void set_dns_listeners(void);
+static void set_tftp_listeners(void);
 static void check_dns_listeners(time_t now);
 static void sig_handler(int sig);
 static void async_event(int pipe, time_t now);
@@ -1046,8 +1047,10 @@ int main (int argc, char **argv)
   pid = getpid();
 
   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
   /* 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 = 1000;
       
-      set_dns_listeners();
+      if (daemon->port != 0)
+       set_dns_listeners();
+      
+#ifdef HAVE_TFTP
+      set_tftp_listeners();
+#endif
 
 #ifdef HAVE_DBUS
       if (option_bool(OPT_DBUS))
@@ -1255,8 +1263,9 @@ int main (int argc, char **argv)
          check_ubus_listeners();
        }
 #endif
-
-      check_dns_listeners(now);
+      
+      if (daemon->port != 0)
+       check_dns_listeners(now);
 
 #ifdef HAVE_TFTP
       check_tftp_listeners(now);
@@ -1522,7 +1531,7 @@ static void async_event(int pipe, time_t now)
              if (errno != EINTR)
                break;
            }      
-         else 
+         else if (daemon->port != 0)
            for (i = 0 ; i < daemon->max_procs; i++)
              if (daemon->tcp_pids[i] == p)
                daemon->tcp_pids[i] = 0;
@@ -1587,9 +1596,10 @@ static void async_event(int pipe, time_t now)
        
       case EVENT_TERM:
        /* Knock all our children on the head. */
-       for (i = 0; i < daemon->max_procs; i++)
-         if (daemon->tcp_pids[i] != 0)
-           kill(daemon->tcp_pids[i], SIGALRM);
+       if (daemon->port != 0)
+         for (i = 0; i < daemon->max_procs; i++)
+           if (daemon->tcp_pids[i] != 0)
+             kill(daemon->tcp_pids[i], SIGALRM);
        
 #if defined(HAVE_SCRIPT) && defined(HAVE_DHCP)
        /* handle pending lease transitions */
@@ -1734,23 +1744,33 @@ void clear_cache_and_reload(time_t now)
 #endif
 }
 
-static void set_dns_listeners(void)
-{
-  struct serverfd *serverfdp;
-  struct listener *listener;
-  struct randfd_list *rfl;
-  int i;
-  
 #ifdef HAVE_TFTP
+static void set_tftp_listeners(void)
+{
   int  tftp = 0;
   struct tftp_transfer *transfer;
+  struct listener *listener;
+  
   if (!option_bool(OPT_SINGLE_PORT))
     for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next)
       {
        tftp++;
        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
+
+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)
     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. */
       if  (listener->tcpfd != -1 && i >= 0)
        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))
@@ -1837,11 +1851,6 @@ static void check_dns_listeners(time_t now)
       if (listener->fd != -1 && poll_check(listener->fd, POLLIN))
        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.
         Note that we can't assume that because we had
         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();
       if (fd != -1)
         poll_listen(fd, POLLIN);
-      set_dns_listeners();
+      if (daemon->port != 0)
+       set_dns_listeners();
+#ifdef HAVE_TFTP
+      set_tftp_listeners();
+#endif
       set_log_writer();
       
 #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();
       
       check_log_writer(0);
-      check_dns_listeners(now);
+      if (daemon->port != 0)
+       check_dns_listeners(now);
       
 #ifdef HAVE_DHCP6
       if (daemon->doing_ra && poll_check(daemon->icmp6fd, POLLIN))
index f036297..d98bfca 100644 (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)
 {
+  struct listener *listener;
   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() */
   if (!option_bool(OPT_SINGLE_PORT))
     for (transfer = daemon->tftp_trans; transfer; transfer = transfer->next)