summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-05-30 19:27:25 +0200
committerChristian Brabandt <cb@256bit.org>2024-05-30 19:27:25 +0200
commit88c8c547d5fc380e5685c2b01ec564ccdf9b259a (patch)
tree4a0dfe9ddf254048b5b61a22e1f50306c808ef59
parent32a5faa6d7592795c6ec77e44dc0357b92b8a681 (diff)
patch 9.1.0451: No test for escaping '<' with shellescape()v9.1.0451
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>
-rw-r--r--src/strings.c8
-rw-r--r--src/structs.h2
-rw-r--r--src/testdir/test_shell.vim4
-rw-r--r--src/version.c2
4 files changed, 11 insertions, 5 deletions
diff --git a/src/strings.c b/src/strings.c
index 9b66ee0e4a..6b2ff0a011 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -269,12 +269,12 @@ vim_strsave_shellescape(char_u *string, int do_special, int do_newline)
*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)
diff --git a/src/structs.h b/src/structs.h
index b5341e3bad..804581bf1b 100644
--- 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;
diff --git a/src/testdir/test_shell.vim b/src/testdir/test_shell.vim
index 7d91dff358..2ac559676f 100644
--- 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))
diff --git a/src/version.c b/src/version.c
index bedc35bf2b..e90bd3074e 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 */
/**/
+ 451,
+/**/
450,
/**/
449,