1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-27 07:41:28 -08:00

Try to avoid malloc SEGVs on Cygwin.

* 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
This commit is contained in:
Paul Eggert 2013-06-23 11:18:47 -07:00
parent 18bb9e21f3
commit c7041908b8
6 changed files with 25 additions and 4 deletions

View 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).

View file

@ -84,7 +84,7 @@ static int synch_process_fd;
/* 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);

View 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

View 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 ();
}

View 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. */

View file

@ -1901,8 +1901,6 @@ init_signals (bool dumping)
sigaction (SIGFPE, &action, 0);
}
catch_child_signal ();
#ifdef SIGUSR1
add_user_signal (SIGUSR1, "sigusr1");
#endif