From: Bram Moolenaar Date: Mon, 20 Aug 2018 19:58:57 +0000 (+0200) Subject: patch 8.1.0302: crash when using :suspend and "fg" X-Git-Tag: v8.1.0302 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f1883479be91550bc31dd88f593b3012863a2629;p=thirdparty%2Fvim.git patch 8.1.0302: crash when using :suspend and "fg" Problem: Crash when using :suspend and "fg". Solution: Undo patch 8.1.244. --- diff --git a/src/os_unix.c b/src/os_unix.c index b044df27f7..39ace2e295 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1228,24 +1228,7 @@ deathtrap SIGDEFARG(sigarg) SIGRETURN; } - static void -after_sigcont(void) -{ -# ifdef FEAT_TITLE - // Don't change "oldtitle" in a signal handler, set a flag to obtain it - // again later. - oldtitle_outdated = TRUE; -# endif - settmode(TMODE_RAW); - need_check_timestamps = TRUE; - did_check_timestamps = FALSE; -} - -#if defined(SIGCONT) -static RETSIGTYPE sigcont_handler SIGPROTOARG; -static int in_mch_suspend = FALSE; - -# if defined(_REENTRANT) && defined(SIGCONT) +#if defined(_REENTRANT) && defined(SIGCONT) /* * On Solaris with multi-threading, suspending might not work immediately. * Catch the SIGCONT signal, which will be used as an indication whether the @@ -1257,7 +1240,7 @@ static int in_mch_suspend = FALSE; * volatile because it is used in signal handler sigcont_handler(). */ static volatile int sigcont_received; -# endif +static RETSIGTYPE sigcont_handler SIGPROTOARG; /* * signal handler for SIGCONT @@ -1265,38 +1248,7 @@ static volatile int sigcont_received; static RETSIGTYPE sigcont_handler SIGDEFARG(sigarg) { - if (in_mch_suspend) - { -# if defined(_REENTRANT) && defined(SIGCONT) - sigcont_received = TRUE; -# endif - } - else - { - // We didn't suspend ourselves, assume we were stopped by a SIGSTOP - // signal (which can't be intercepted) and get a SIGCONT. Need to get - // back to a sane mode and redraw. - after_sigcont(); - - update_screen(CLEAR); - if (State & CMDLINE) - redrawcmdline(); - else if (State == HITRETURN || State == SETWSIZE || State == ASKMORE - || State == EXTERNCMD || State == CONFIRM || exmode_active) - repeat_message(); - else if (redrawing()) - setcursor(); -#if defined(FEAT_INS_EXPAND) - if (pum_visible()) - { - redraw_later(NOT_VALID); - ins_compl_show_pum(); - } -#endif - cursor_on_force(); - out_flush(); - } - + sigcont_received = TRUE; SIGRETURN; } #endif @@ -1379,8 +1331,6 @@ mch_suspend(void) { /* BeOS does have SIGTSTP, but it doesn't work. */ #if defined(SIGTSTP) && !defined(__BEOS__) - in_mch_suspend = TRUE; - out_flush(); /* needed to make cursor visible on some systems */ settmode(TMODE_COOK); out_flush(); /* needed to disable mouse on some systems */ @@ -1412,9 +1362,16 @@ mch_suspend(void) mch_delay(wait_time, FALSE); } # endif - in_mch_suspend = FALSE; - after_sigcont(); +# ifdef FEAT_TITLE + /* + * Set oldtitle to NULL, so the current title is obtained again. + */ + VIM_CLEAR(oldtitle); +# endif + settmode(TMODE_RAW); + need_check_timestamps = TRUE; + did_check_timestamps = FALSE; #else suspend_shell(); #endif @@ -1454,7 +1411,7 @@ set_signals(void) #ifdef SIGTSTP signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); #endif -#if defined(SIGCONT) +#if defined(_REENTRANT) && defined(SIGCONT) signal(SIGCONT, sigcont_handler); #endif diff --git a/src/proto/term.pro b/src/proto/term.pro index 1b8ab5f0dd..c68d7ab033 100644 --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -52,7 +52,6 @@ void setmouse(void); int mouse_has(int c); int mouse_model_popup(void); void scroll_start(void); -void cursor_on_force(void); void cursor_on(void); void cursor_off(void); void term_cursor_mode(int forced); diff --git a/src/term.c b/src/term.c index 66f03ee108..97ddf8bc4a 100644 --- a/src/term.c +++ b/src/term.c @@ -3833,16 +3833,6 @@ scroll_start(void) static int cursor_is_off = FALSE; -/* - * Enable the cursor without checking if it's already enabled. - */ - void -cursor_on_force(void) -{ - out_str(T_VE); - cursor_is_off = FALSE; -} - /* * Enable the cursor. */ @@ -3850,7 +3840,10 @@ cursor_on_force(void) cursor_on(void) { if (cursor_is_off) - cursor_on_force(); + { + out_str(T_VE); + cursor_is_off = FALSE; + } } /* diff --git a/src/version.c b/src/version.c index 4cb2f34195..42a81ccfa8 100644 --- a/src/version.c +++ b/src/version.c @@ -794,6 +794,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 302, /**/ 301, /**/