From 978c121de1b63377ea88eac42ce52a697d7977a8 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Wed, 27 Mar 2019 17:15:31 +0100 Subject: [PATCH] speller: block the resizing signal again during an external spell check Somehow a SIGWINCH pushes nano past the wait() in do_alt_speller(), even though the external spelling program hasn't finished. This fixes https://savannah.gnu.org/bugs/?56010 by reverting commit 1f39f60b. Bug existed since version 3.2. --- src/nano.c | 11 +++++++++++ src/proto.h | 1 + src/text.c | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/nano.c b/src/nano.c index bed082e8..a2c39048 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1362,6 +1362,17 @@ void regenerate_screen(void) total_refresh(); } +/* If allow is FALSE, block any SIGWINCH signal. If allow is TRUE, + * unblock SIGWINCH so any pending ones can be dealt with. */ +void allow_sigwinch(bool allow) +{ + sigset_t winch; + + sigemptyset(&winch); + sigaddset(&winch, SIGWINCH); + sigprocmask(allow ? SIG_UNBLOCK : SIG_BLOCK, &winch, NULL); +} + /* Handle the global toggle specified in flag. */ void do_toggle(int flag) { diff --git a/src/proto.h b/src/proto.h index f25a175d..4b6528f0 100644 --- a/src/proto.h +++ b/src/proto.h @@ -427,6 +427,7 @@ RETSIGTYPE do_continue(int signal); #ifndef NANO_TINY RETSIGTYPE handle_sigwinch(int signal); void regenerate_screen(void); +void allow_sigwinch(bool allow); void do_toggle(int flag); void enable_signals(void); #endif diff --git a/src/text.c b/src/text.c index f53b16c5..98441392 100644 --- a/src/text.c +++ b/src/text.c @@ -2652,6 +2652,11 @@ const char *do_alt_speller(char *tempfile_name) } else if (pid_spell < 0) return _("Could not fork"); +#ifndef NANO_TINY + /* Block SIGWINCHes so the spell checker doesn't get any. */ + allow_sigwinch(FALSE); +#endif + /* Wait for the alternate spell checker to finish. */ wait(&alt_spell_status); @@ -2706,6 +2711,11 @@ const char *do_alt_speller(char *tempfile_name) adjust_viewport(STATIONARY); } +#ifndef NANO_TINY + /* Unblock SIGWINCHes again. */ + allow_sigwinch(TRUE); +#endif + return NULL; }