Mercurial > vim
changeset 35295:48d01e3323ca v9.1.0451
patch 9.1.0451: No test for escaping '<' with shellescape()
Commit: https://github.com/vim/vim/commit/88c8c547d5fc380e5685c2b01ec564ccdf9b259a
Author: zeertzjq <zeertzjq@outlook.com>
Date: Thu May 30 19:27:25 2024 +0200
patch 9.1.0451: No test for escaping '<' with shellescape()
Problem: No test for escaping '<' with shellescape()
Solution: Add a test. Use memcpy() in code to make it easier to
understand. Fix a typo (zeertzjq).
closes: #14876
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 30 May 2024 19:30:04 +0200 |
parents | 87914e4b8178 |
children | 5b2f907bd698 |
files | src/strings.c src/structs.h src/testdir/test_shell.vim src/version.c |
diffstat | 4 files changed, 11 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/strings.c +++ b/src/strings.c @@ -269,12 +269,12 @@ vim_strsave_shellescape(char_u *string, *d++ = *p++; continue; } - if (do_special && find_cmdline_var(p, &l) >= 0 && l > 0) + if (do_special && find_cmdline_var(p, &l) >= 0) { *d++ = '\\'; // insert backslash - do // copy the var - *d++ = *p++; - while (--l > 0); + memcpy(d, p, l); // copy the var + d += l; + p += l; continue; } if (*p == '\\' && fish_like)
--- a/src/structs.h +++ b/src/structs.h @@ -4795,7 +4795,7 @@ typedef struct soffset typedef struct spat { char_u *pat; // the pattern (in allocated memory) or NULL - size_t patlen; // the length of the patten (0 is pat is NULL) + size_t patlen; // the length of the pattern (0 if pat is NULL) int magic; // magicness of the pattern int no_scs; // no smartcase for this pattern soffset_T off;
--- a/src/testdir/test_shell.vim +++ b/src/testdir/test_shell.vim @@ -158,6 +158,10 @@ func Test_shellescape() call assert_equal("'te\\#xt'", shellescape("te#xt", 1)) call assert_equal("'te!xt'", shellescape("te!xt")) call assert_equal("'te\\!xt'", shellescape("te!xt", 1)) + call assert_equal("'te<cword>xt'", shellescape("te<cword>xt")) + call assert_equal("'te\\<cword>xt'", shellescape("te<cword>xt", 1)) + call assert_equal("'te<cword>%xt'", shellescape("te<cword>%xt")) + call assert_equal("'te\\<cword>\\%xt'", shellescape("te<cword>%xt", 1)) call assert_equal("'te\nxt'", shellescape("te\nxt")) call assert_equal("'te\\\nxt'", shellescape("te\nxt", 1))