diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-08-08 21:05:57 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-08-08 21:05:57 +0200 |
commit | 6b97d7ad197de0fb38648c91552c4374e39fdf98 (patch) | |
tree | faac7d8197db2529ef034add3a4d89bd5c34e9be | |
parent | 39eff4cdc055a0f0db0d32fcf7a74fe30ea54f25 (diff) |
patch 9.1.0665: Locked variable can be changed in a :for loopv9.1.0665
Problem: Locked variable can be changed in a :for loop.
Solution: Always do a full permission check on the first loop iteration
where ASSIGN_DECL is not set (zeertzjq).
related: #12470
fixes: #15450
closes: #15454
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/evalvars.c | 2 | ||||
-rw-r--r-- | src/testdir/test_eval_stuff.vim | 27 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 29 insertions, 2 deletions
diff --git a/src/evalvars.c b/src/evalvars.c index 6facbeb138..f18b51637b 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -4100,7 +4100,7 @@ set_var_const( // Modifying a final variable with a List value using the "+=" // operator is allowed. For other types, it is not allowed. - if (((flags & ASSIGN_FOR_LOOP) == 0 + if ((((flags & ASSIGN_FOR_LOOP) == 0 || (flags & ASSIGN_DECL) == 0) && ((flags & ASSIGN_COMPOUND_OP) == 0 || !type_inplace_modifiable)) ? var_check_permission(di, name) == FAIL diff --git a/src/testdir/test_eval_stuff.vim b/src/testdir/test_eval_stuff.vim index a346399eb5..1b17108c4f 100644 --- a/src/testdir/test_eval_stuff.vim +++ b/src/testdir/test_eval_stuff.vim @@ -2,6 +2,7 @@ source view_util.vim source shared.vim +import './vim9.vim' as v9 function s:foo() abort try @@ -126,7 +127,31 @@ func Test_for_invalid() call assert_fails("for x in 99", 'E1098:') call assert_fails("for x in function('winnr')", 'E1098:') call assert_fails("for x in {'a': 9}", 'E1098:') - call assert_fails("for v:maxcol in range(1)", 'E46:') + + let lines =<< trim END + for v:maxcol in range(5) + endfor + END + + let save_v_maxcol = v:maxcol + call v9.CheckLegacyAndVim9Failure(lines, 'E46:') + call assert_equal(save_v_maxcol, v:maxcol) + + let lines =<< trim END + for g:constvar in range(5) + endfor + END + + const g:constvar = 10 + call v9.CheckLegacyAndVim9Failure(lines, 'E741:') + call assert_equal(10, g:constvar) + unlet g:constvar + + let g:constvar = 10 + lockvar 0 g:constvar + call v9.CheckLegacyAndVim9Failure(lines, 'E1122:') + call assert_equal(10, g:constvar) + unlet g:constvar if 0 /1/5/2/s/\n diff --git a/src/version.c b/src/version.c index ce5894f89a..1b7e423353 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 665, +/**/ 664, /**/ 663, |