]> git.eshelyaron.com Git - emacs.git/commitdiff
Try to avoid malloc SEGVs on Cygwin.
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 23 Jun 2013 18:18:47 +0000 (11:18 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 23 Jun 2013 18:18:47 +0000 (11:18 -0700)
* callproc.c, process.h (block_child_signal, unblock_child_signal):
Now extern.
* emacs.c (main): Catch SIGCHLD just before initializing gfilenotify.
* process.c (catch_child_signal): Block SIGCHLD while futzing with
the SIGCHLD handler, since the code is not atomic and (due to glib)
signals may be arriving now.
* sysdep.c (init_signals): Do not catch child signals here;
'main' now does that later, at a safer time.

Fixes: debbugs:14569
src/ChangeLog
src/callproc.c
src/emacs.c
src/process.c
src/process.h
src/sysdep.c

index 202331dac53e4032152e150a4d8e635b1d361759..b2773ddbf5077156e19833ba9e37c290b08187c2 100644 (file)
@@ -1,3 +1,15 @@
+2013-06-23  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Try to avoid malloc SEGVs on Cygwin (Bug#14569).
+       * callproc.c, process.h (block_child_signal, unblock_child_signal):
+       Now extern.
+       * emacs.c (main): Catch SIGCHLD just before initializing gfilenotify.
+       * process.c (catch_child_signal): Block SIGCHLD while futzing with
+       the SIGCHLD handler, since the code is not atomic and (due to glib)
+       signals may be arriving now.
+       * sysdep.c (init_signals): Do not catch child signals here;
+       'main' now does that later, at a safer time.
+
 2013-06-22  Paul Eggert  <eggert@cs.ucla.edu>
 
        Clean up SIGCHLD handling a bit (Bug#14569).
index 745d58c45f4bc0326a1f505d08f3fafec82414e1..f0aa8222342c05b59c00987ad1bde33c1ffc246a 100644 (file)
@@ -84,7 +84,7 @@ static int synch_process_fd;
 \f
 /* Block SIGCHLD.  */
 
-static void
+void
 block_child_signal (void)
 {
   sigset_t blocked;
@@ -95,7 +95,7 @@ block_child_signal (void)
 
 /* Unblock SIGCHLD.  */
 
-static void
+void
 unblock_child_signal (void)
 {
   pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
index 13f6d117ebc5ea7559fe2c199d06d9471453b092..c5b32c7c0e74b45bc378eb90f8d05171a1887c74 100644 (file)
@@ -1257,6 +1257,13 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
     tzset ();
 #endif /* MSDOS */
 
+  /* Do this after initializing the memory allocator, since it uses
+     glib and glib uses malloc.  And do it before anything else that
+     invokes glib, to avoid potential races among glib subthreads in
+     Cygwin glib.  gfilenotify invokes glib, so this can't be delayed
+     further.  */
+  catch_child_signal ();
+
 #ifdef HAVE_GFILENOTIFY
   globals_of_gfilenotify ();
 #endif
index 3e31dede4c2c753de281d465de37113def351ead..6df1bf7eff74a496edef25f35aa2adf1ccfd7296 100644 (file)
@@ -7084,11 +7084,13 @@ catch_child_signal (void)
 #endif
 
   emacs_sigaction_init (&action, deliver_child_signal);
+  block_child_signal ();
   sigaction (SIGCHLD, &action, &old_action);
   eassert (! (old_action.sa_flags & SA_SIGINFO));
   if (old_action.sa_handler != SIG_DFL && old_action.sa_handler != SIG_IGN
       && old_action.sa_handler != deliver_child_signal)
     lib_child_handler = old_action.sa_handler;
+  unblock_child_signal ();
 }
 
 \f
index 9455df18bebe7f8c2a472cf803bb83225b8e4a81..3f86e5f3945a678c9c82d5bc03afc75e53b298d4 100644 (file)
@@ -200,6 +200,8 @@ extern Lisp_Object QCflowcontrol, Qhw, Qsw, QCsummary;
 
 /* Defined in callproc.c.  */
 
+extern void block_child_signal (void);
+extern void unblock_child_signal (void);
 extern void record_kill_process (struct Lisp_Process *);
 
 /* Defined in process.c.  */
index c2769865b5dda7771c391aa5b8508018e41d0408..1d3e646d359c3ae568e43e8a03ad7d71a57139a4 100644 (file)
@@ -1901,8 +1901,6 @@ init_signals (bool dumping)
       sigaction (SIGFPE, &action, 0);
     }
 
-  catch_child_signal ();
-
 #ifdef SIGUSR1
   add_user_signal (SIGUSR1, "sigusr1");
 #endif