commit 978c121de1b63377ea88eac42ce52a697d7977a8
parent f6a7983a8ad9c0a36343e4fc1625d3284271ba3e
Author: Benno Schulenberg <bensberg@telfort.nl>
Date: Wed, 27 Mar 2019 17:15:31 +0100
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.
Diffstat:
3 files changed, 22 insertions(+), 0 deletions(-)
diff --git 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
@@ -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
@@ -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;
}