]> git.eshelyaron.com Git - emacs.git/commitdiff
Don’t create fd >= FD_SETSIZE
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 2 Sep 2016 04:15:35 +0000 (21:15 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 2 Sep 2016 04:16:03 +0000 (21:16 -0700)
This avoids a potential crash if too many subprocesses (Bug#24325).
* src/process.c [HAVE_SETRLIMIT]: Include <sys/resource.h>.
(init_process_emacs): If ulimit -n is greater than FD_SETSIZE,
set it to FD_SETSIZE.

src/process.c

index 69d1b2a11ba9a5d57eb3e58c597906a6b664580d..344a886be199015b2836ffbd471bf50b29dc0979 100644 (file)
@@ -39,6 +39,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
+#ifdef HAVE_SETRLIMIT
+# include <sys/resource.h>
+#endif
+
 /* Are local (unix) sockets supported?  */
 #if defined (HAVE_SYS_UN_H)
 #if !defined (AF_LOCAL) && defined (AF_UNIX)
@@ -7784,6 +7788,16 @@ init_process_emacs (int sockfd)
       catch_child_signal ();
     }
 
+#ifdef HAVE_SETRLIMIT
+  /* Don't allocate more than FD_SETSIZE file descriptors.  */
+  struct rlimit rlim;
+  if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && FD_SETSIZE < rlim.rlim_cur)
+    {
+      rlim.rlim_cur = FD_SETSIZE;
+      setrlimit (RLIMIT_NOFILE, &rlim);
+    }
+#endif
+
   FD_ZERO (&input_wait_mask);
   FD_ZERO (&non_keyboard_wait_mask);
   FD_ZERO (&non_process_wait_mask);