0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.1513: cannot interrupt shell used for filename expansion

Problem:    Cannot interrupt shell used for filename expansion. (Dominique
            Pellé)
Solution:   Do set tmode in mch_delay(). (closes #6770)
This commit is contained in:
Bram Moolenaar 2020-08-23 14:28:37 +02:00
parent 69e44552c5
commit 0981c8729e
12 changed files with 41 additions and 26 deletions

View File

@ -904,7 +904,7 @@ channel_connect(
*waittime -= elapsed_msec; *waittime -= elapsed_msec;
if (waitnow > 0) if (waitnow > 0)
{ {
mch_delay((long)waitnow, TRUE); mch_delay((long)waitnow, MCH_DELAY_IGNOREINPUT);
ui_breakcheck(); ui_breakcheck();
*waittime -= waitnow; *waittime -= waitnow;
} }

View File

@ -2243,7 +2243,7 @@ cs_release_csp(int i, int freefnpp)
waitpid_errno = errno; waitpid_errno = errno;
if (pid != 0) if (pid != 0)
break; // break unless the process is still running break; // break unless the process is still running
mch_delay(50L, FALSE); // sleep 50 ms mch_delay(50L, 0); // sleep 50 ms
} }
# endif # endif
/* /*
@ -2278,7 +2278,7 @@ cs_release_csp(int i, int freefnpp)
alive = FALSE; // cscope process no longer exists alive = FALSE; // cscope process no longer exists
break; break;
} }
mch_delay(50L, FALSE); // sleep 50ms mch_delay(50L, 0); // sleep 50 ms
} }
} }
if (alive) if (alive)

View File

@ -222,10 +222,10 @@ mch_avail_mem(int special)
/* /*
* Waits a specified amount of time, or until input arrives if * Waits a specified amount of time, or until input arrives if
* ignoreinput is FALSE. * flags does not have MCH_DELAY_IGNOREINPUT.
*/ */
void void
mch_delay(long msec, int ignoreinput) mch_delay(long msec, int flags)
{ {
#ifndef LATTICE // SAS declares void Delay(ULONG) #ifndef LATTICE // SAS declares void Delay(ULONG)
void Delay(long); void Delay(long);
@ -233,7 +233,7 @@ mch_delay(long msec, int ignoreinput)
if (msec > 0) if (msec > 0)
{ {
if (ignoreinput) if (flags & MCH_DELAY_IGNOREINPUT)
Delay(msec / 20L); // Delay works with 20 msec intervals Delay(msec / 20L); // Delay works with 20 msec intervals
else else
WaitForChar(raw_in, msec * 1000L); WaitForChar(raw_in, msec * 1000L);

View File

@ -577,15 +577,19 @@ mch_total_mem(int special UNUSED)
} }
#endif #endif
/*
* "flags": MCH_DELAY_IGNOREINPUT - don't read input
* MCH_DELAY_SETTMODE - use settmode() even for short delays
*/
void void
mch_delay(long msec, int ignoreinput) mch_delay(long msec, int flags)
{ {
tmode_T old_tmode; tmode_T old_tmode;
#ifdef FEAT_MZSCHEME #ifdef FEAT_MZSCHEME
long total = msec; // remember original value long total = msec; // remember original value
#endif #endif
if (ignoreinput) if (flags & MCH_DELAY_IGNOREINPUT)
{ {
// Go to cooked mode without echo, to allow SIGINT interrupting us // Go to cooked mode without echo, to allow SIGINT interrupting us
// here. But we don't want QUIT to kill us (CTRL-\ used in a // here. But we don't want QUIT to kill us (CTRL-\ used in a
@ -593,7 +597,8 @@ mch_delay(long msec, int ignoreinput)
// Only do this if sleeping for more than half a second. // Only do this if sleeping for more than half a second.
in_mch_delay = TRUE; in_mch_delay = TRUE;
old_tmode = mch_cur_tmode; old_tmode = mch_cur_tmode;
if (mch_cur_tmode == TMODE_RAW && msec > 500) if (mch_cur_tmode == TMODE_RAW
&& (msec > 500 || (flags & MCH_DELAY_SETTMODE)))
settmode(TMODE_SLEEP); settmode(TMODE_SLEEP);
/* /*
@ -636,10 +641,8 @@ mch_delay(long msec, int ignoreinput)
tv.tv_sec = msec / 1000; tv.tv_sec = msec / 1000;
tv.tv_usec = (msec % 1000) * 1000; tv.tv_usec = (msec % 1000) * 1000;
/* // NOTE: Solaris 2.6 has a bug that makes select() hang here. Get
* NOTE: Solaris 2.6 has a bug that makes select() hang here. Get // a patch from Sun to fix this. Reported by Gunnar Pedersen.
* a patch from Sun to fix this. Reported by Gunnar Pedersen.
*/
select(0, NULL, NULL, NULL, &tv); select(0, NULL, NULL, NULL, &tv);
} }
# endif // HAVE_SELECT # endif // HAVE_SELECT
@ -650,7 +653,7 @@ mch_delay(long msec, int ignoreinput)
while (total > 0); while (total > 0);
#endif #endif
if (msec > 500) if (msec > 500 || (flags & MCH_DELAY_SETTMODE))
settmode(old_tmode); settmode(old_tmode);
in_mch_delay = FALSE; in_mch_delay = FALSE;
} }
@ -1284,7 +1287,7 @@ mch_suspend(void)
long wait_time; long wait_time;
for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++) for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++)
mch_delay(wait_time, FALSE); mch_delay(wait_time, 0);
} }
# endif # endif
in_mch_suspend = FALSE; in_mch_suspend = FALSE;
@ -4170,7 +4173,7 @@ wait4pid(pid_t child, waitstatus *status)
if (wait_pid == 0) if (wait_pid == 0)
{ {
// Wait for 1 to 10 msec before trying again. // Wait for 1 to 10 msec before trying again.
mch_delay(delay_msec, TRUE); mch_delay(delay_msec, MCH_DELAY_IGNOREINPUT | MCH_DELAY_SETTMODE);
if (++delay_msec > 10) if (++delay_msec > 10)
delay_msec = 10; delay_msec = 10;
continue; continue;
@ -5262,6 +5265,9 @@ finished:
{ {
long delay_msec = 1; long delay_msec = 1;
out_str(T_CTE); // possibly disables modifyOtherKeys, so that
// the system can recognize CTRL-C
/* /*
* Similar to the loop above, but only handle X events, no * Similar to the loop above, but only handle X events, no
* I/O. * I/O.
@ -5295,11 +5301,14 @@ finished:
clip_update(); clip_update();
// Wait for 1 to 10 msec. 1 is faster but gives the child // Wait for 1 to 10 msec. 1 is faster but gives the child
// less time. // less time, gradually wait longer.
mch_delay(delay_msec, TRUE); mch_delay(delay_msec,
MCH_DELAY_IGNOREINPUT | MCH_DELAY_SETTMODE);
if (++delay_msec > 10) if (++delay_msec > 10)
delay_msec = 10; delay_msec = 10;
} }
out_str(T_CTI); // possibly enables modifyOtherKeys again
} }
# endif # endif
@ -6710,7 +6719,7 @@ mch_expand_wildcards(
// When running in the background, give it some time to create the temp // When running in the background, give it some time to create the temp
// file, but don't wait for it to finish. // file, but don't wait for it to finish.
if (ampersand) if (ampersand)
mch_delay(10L, TRUE); mch_delay(10L, MCH_DELAY_IGNOREINPUT);
extra_shell_arg = NULL; // cleanup extra_shell_arg = NULL; // cleanup
show_shell_mess = TRUE; show_shell_mess = TRUE;

View File

@ -6739,7 +6739,7 @@ notsgr:
void void
mch_delay( mch_delay(
long msec, long msec,
int ignoreinput UNUSED) int flags UNUSED)
{ {
#if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL) #if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
Sleep((int)msec); // never wait for input Sleep((int)msec); // never wait for input
@ -6751,7 +6751,7 @@ mch_delay(
return; return;
} }
# endif # endif
if (ignoreinput) if (flags & MCH_DELAY_IGNOREINPUT)
# ifdef FEAT_MZSCHEME # ifdef FEAT_MZSCHEME
if (mzthreads_allowed() && p_mzq > 0 && msec > p_mzq) if (mzthreads_allowed() && p_mzq > 0 && msec > p_mzq)
{ {

View File

@ -5,7 +5,7 @@ void mch_write(char_u *p, int len);
int mch_inchar(char_u *buf, int maxlen, long time, int tb_change_cnt); int mch_inchar(char_u *buf, int maxlen, long time, int tb_change_cnt);
int mch_char_avail(void); int mch_char_avail(void);
long_u mch_avail_mem(int special); long_u mch_avail_mem(int special);
void mch_delay(long msec, int ignoreinput); void mch_delay(long msec, int flags);
void mch_suspend(void); void mch_suspend(void);
void mch_init(void); void mch_init(void);
int mch_check_win(int argc, char **argv); int mch_check_win(int argc, char **argv);

View File

@ -5,7 +5,7 @@ int mch_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
int mch_char_avail(void); int mch_char_avail(void);
int mch_check_messages(void); int mch_check_messages(void);
long_u mch_total_mem(int special); long_u mch_total_mem(int special);
void mch_delay(long msec, int ignoreinput); void mch_delay(long msec, int flags);
int mch_stackcheck(char *p); int mch_stackcheck(char *p);
void mch_suspend(void); void mch_suspend(void);
void mch_init(void); void mch_init(void);

View File

@ -53,7 +53,7 @@ int mch_signal_job(job_T *job, char_u *how);
void mch_clear_job(job_T *job); void mch_clear_job(job_T *job);
void mch_set_normal_colors(void); void mch_set_normal_colors(void);
void mch_write(char_u *s, int len); void mch_write(char_u *s, int len);
void mch_delay(long msec, int ignoreinput); void mch_delay(long msec, int flags);
int mch_remove(char_u *name); int mch_remove(char_u *name);
void mch_breakcheck(int force); void mch_breakcheck(int force);
long_u mch_total_mem(int special); long_u mch_total_mem(int special);

View File

@ -3598,7 +3598,7 @@ stoptermcap(void)
{ {
# ifdef UNIX # ifdef UNIX
// Give the terminal a chance to respond. // Give the terminal a chance to respond.
mch_delay(100L, FALSE); mch_delay(100L, 0);
# endif # endif
# ifdef TCIFLUSH # ifdef TCIFLUSH
// Discard data received but not read. // Discard data received but not read.

View File

@ -539,7 +539,7 @@ ui_delay(long msec_arg, int ignoreinput)
gui_wait_for_chars(msec, typebuf.tb_change_cnt); gui_wait_for_chars(msec, typebuf.tb_change_cnt);
else else
#endif #endif
mch_delay(msec, ignoreinput); mch_delay(msec, ignoreinput ? MCH_DELAY_IGNOREINPUT : 0);
} }
/* /*

View File

@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1513,
/**/ /**/
1512, 1512,
/**/ /**/

View File

@ -2668,4 +2668,8 @@ long elapsed(DWORD start_tick);
#define READDIR_SORT_IC 2 // sort ignoring case (strcasecmp) #define READDIR_SORT_IC 2 // sort ignoring case (strcasecmp)
#define READDIR_SORT_COLLATE 3 // sort according to collation (strcoll) #define READDIR_SORT_COLLATE 3 // sort according to collation (strcoll)
// Flags for mch_delay.
#define MCH_DELAY_IGNOREINPUT 1
#define MCH_DELAY_SETTMODE 2
#endif // VIM__H #endif // VIM__H