Mercurial > vim
changeset 28515:c6aadb2c4cd7 v8.2.4782
patch 8.2.4782: accessing freed memory
Commit: https://github.com/vim/vim/commit/a929c922b1cb7c84ad1b5d1d0fc9a4f7c68ab8e0
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 18 Apr 2022 16:30:03 +0200 |
parents | 0f69ddbdde1f |
children | 91556781726b |
files | src/testdir/test_lambda.vim src/userfunc.c src/version.c |
diffstat | 3 files changed, 20 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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'))
--- 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);