# HG changeset patch # User Bram Moolenaar # Date 1650292203 -7200 # Node ID c6aadb2c4cd7d068acb0218b2d36e7c55bf5452a # Parent 0f69ddbdde1febe9e9c24df63f59c7cc542e2a65 patch 8.2.4782: accessing freed memory Commit: https://github.com/vim/vim/commit/a929c922b1cb7c84ad1b5d1d0fc9a4f7c68ab8e0 Author: Bram Moolenaar Date: Mon Apr 18 15:21:17 2022 +0100 patch 8.2.4782: accessing freed memory Problem: Accessing freed memory. Solution: Clear evalarg after checking for trailing characters. (issue #10218) diff --git a/src/testdir/test_lambda.vim b/src/testdir/test_lambda.vim --- a/src/testdir/test_lambda.vim +++ b/src/testdir/test_lambda.vim @@ -1,6 +1,7 @@ " Test for lambda and closure source check.vim +import './vim9.vim' as v9 func Test_lambda_feature() call assert_equal(1, has('lambda')) @@ -54,6 +55,21 @@ func Test_lambda_with_timer() call assert_true(s:n > m) endfunc +func Test_lambda_vim9cmd_linebreak() + CheckFeature timers + + let lines =<< trim END + vim9cmd call timer_start(10, (x) => { + # comment + g:result = 'done' + }) + END + call v9.CheckScriptSuccess(lines) + sleep 50m + call assert_equal('done', g:result) + unlet g:result +endfunc + func Test_lambda_with_partial() let l:Cb = function({... -> ['zero', a:1, a:2, a:3]}, ['one', 'two']) call assert_equal(['zero', 'one', 'two', 'three'], l:Cb('three')) diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -5529,7 +5529,6 @@ ex_call(exarg_T *eap) } if (eap->skip) --emsg_skip; - clear_evalarg(&evalarg, eap); // When inside :try we need to check for following "| catch" or "| endtry". // Not when there was an error, but do check if an exception was thrown. @@ -5549,6 +5548,8 @@ ex_call(exarg_T *eap) else set_nextcmd(eap, arg); } + // Must be after using "arg", it may point into memory cleared here. + clear_evalarg(&evalarg, eap); end: dict_unref(fudi.fd_dict); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4782, +/**/ 4781, /**/ 4780,