summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-10-04 18:52:19 +0100
committerBram Moolenaar <Bram@vim.org>2021-10-04 18:52:19 +0100
commita684a684096ecef3fbaee39c573b47423235d6b1 (patch)
tree387ee22bdbd6a9d0483b695cb09686c7af9b1fa2 /src
parent50c56893423eb6ad2154a4151e67f7097f52efb6 (diff)
patch 8.2.3470: crash with error in :catch and also in :finallyv8.2.3470
Problem: Crash with error in :catch and also in :finally. Solution: Only discard an exception if there is one. (closes #8954)
Diffstat (limited to 'src')
-rw-r--r--src/ex_eval.c3
-rw-r--r--src/testdir/test_trycatch.vim12
-rw-r--r--src/version.c2
3 files changed, 16 insertions, 1 deletions
diff --git a/src/ex_eval.c b/src/ex_eval.c
index 259cf670cc..503a3ae02a 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -2374,7 +2374,8 @@ cleanup_conditionals(
default:
if (cstack->cs_flags[idx] & CSF_FINALLY)
{
- if (cstack->cs_pending[idx] & CSTP_THROW)
+ if ((cstack->cs_pending[idx] & CSTP_THROW)
+ && cstack->cs_exception[idx] != NULL)
{
// Cancel the pending exception. This is in the
// finally clause, so that the stack of the
diff --git a/src/testdir/test_trycatch.vim b/src/testdir/test_trycatch.vim
index 052fab7bb7..ac12671da6 100644
--- a/src/testdir/test_trycatch.vim
+++ b/src/testdir/test_trycatch.vim
@@ -2273,6 +2273,18 @@ func Test_user_command_function_call_with_endtry()
call delete('XtestThrow')
endfunc
+func ThisWillFail()
+ try
+ if x | endif
+ catch
+ for l in []
+ finally
+endfunc
+
+func Test_error_in_catch_and_finally()
+ call assert_fails('call ThisWillFail()', ['E121:', 'E600:'])
+endfunc
+
" Modeline {{{1
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index d15495ec5d..23b0c3682c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3470,
+/**/
3469,
/**/
3468,