]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
Fix problem if dnsmasq is started without the stdin,
authorSimon Kelley <simon@thekelleys.org.uk>
Wed, 18 Jan 2012 16:07:21 +0000 (16:07 +0000)
committerSimon Kelley <simon@thekelleys.org.uk>
Wed, 18 Jan 2012 16:07:21 +0000 (16:07 +0000)
stdout and stderr file descriptors open. This can manifest
itself as 100% CPU use. Thanks to Chris Moore for finding
this.

CHANGELOG
src/dnsmasq.c

index b33bf5ac97253094b4a2efff9218c4abd83e7967..0950191c6d5e32f2dc18592f25db14eca689f11f 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -29,6 +29,14 @@ version 2.60
            Determine VERSION automatically based on git magic:
            release tags or hash values.
 
+           Improve start-up speed when reading large hosts files 
+           containing many distinct addresses.
+
+           Fix problem if dnsmasq is started without the stdin,
+           stdout and stderr file descriptors open. This can manifest
+           itself as 100% CPU use. Thanks to Chris Moore for finding
+           this.
+
            
 version 2.59
             Fix regression in 2.58 which caused failure to start up
index 0b17df3cc4c7233c077dc91a17dcf3c5d723a4cd..f8b3d07942d955cf6ac7f9638380ce44f5e299e6 100644 (file)
@@ -92,10 +92,19 @@ int main (int argc, char **argv)
     }
 #endif
   
-  /* Close any file descriptors we inherited apart from std{in|out|err} */
+  /* Close any file descriptors we inherited apart from std{in|out|err} 
+     
+     Ensure that at least stdin, stdout and stderr (fd 0, 1, 2) exist,
+     otherwise file descriptors we create can end up being 0, 1, or 2 
+     and then get accidentally closed later when we make 0, 1, and 2 
+     open to /dev/null. Normally we'll be started with 0, 1 and 2 open, 
+     but it's not guaranteed. By opening /dev/null three times, we 
+     ensure that we're not using those fds for real stuff. */
   for (i = 0; i < max_fd; i++)
     if (i != STDOUT_FILENO && i != STDERR_FILENO && i != STDIN_FILENO)
       close(i);
+    else
+      open("/dev/null", O_RDWR); 
 
 #ifdef HAVE_LINUX_NETWORK
   netlink_init();