# HG changeset patch # User Bram Moolenaar # Date 1661546706 -7200 # Node ID a63d3a0e9aba416e603709358c0b742788548eb5 # Parent 24c45f87cda4bb0434fd806b1d0b77b131bd30cc patch 9.0.0282: a nested timout stops the previous timeout Commit: https://github.com/vim/vim/commit/0f618386367ba9388e1f50bc665bc1add6c01567 Author: Bram Moolenaar Date: Fri Aug 26 21:33:04 2022 +0100 patch 9.0.0282: a nested timout stops the previous timeout Problem: A nested timout stops the previous timeout. Solution: Ignore any nested timeout. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -9176,7 +9176,8 @@ do_searchpair( theend: #ifdef FEAT_RELTIME - disable_regexp_timeout(); + if (time_limit > 0) + disable_regexp_timeout(); #endif vim_free(pat2); vim_free(pat3); diff --git a/src/regexp.c b/src/regexp.c --- a/src/regexp.c +++ b/src/regexp.c @@ -51,17 +51,32 @@ toggle_Magic(int x) } #ifdef FEAT_RELTIME +static int timeout_nesting = 0; + +/* + * Start a timer that will cause the regexp to abort after "msec". + * This doesn't work well recursively. In case it happens anyway, the first + * set timeout will prevail, nested ones are ignored. + * The caller must make sure there is a matching disable_regexp_timeout() call! + */ void init_regexp_timeout(long msec) { - timeout_flag = start_timeout(msec); + if (timeout_nesting == 0) + timeout_flag = start_timeout(msec); + ++timeout_nesting; } void disable_regexp_timeout(void) { - stop_timeout(); - timeout_flag = &dummy_timeout_flag; + if (timeout_nesting == 0) + iemsg("disable_regexp_timeout() called without active timer"); + else if (--timeout_nesting == 0) + { + stop_timeout(); + timeout_flag = &dummy_timeout_flag; + } } #endif diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -708,6 +708,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 282, +/**/ 281, /**/ 280,