1
0
forked from aniani/vim

patch 9.1.0438: Wrong Ex command executed when :g uses '?' as delimiter

Problem:  Wrong Ex command executed when :g uses '?' as delimiter and
          pattern contains escaped '?'.
Solution: Don't use "*newp" when it's not allocated (zeertzjq).

closes: #14837

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2024-05-24 07:37:36 +02:00
committed by Christian Brabandt
parent 22ac941208
commit 3074137542
4 changed files with 21 additions and 5 deletions

View File

@@ -620,7 +620,7 @@ skip_regexp_ex(
{ {
magic_T mymagic; magic_T mymagic;
char_u *p = startp; char_u *p = startp;
size_t startplen = STRLEN(startp); size_t startplen = 0;
if (magic) if (magic)
mymagic = MAGIC_ON; mymagic = MAGIC_ON;
@@ -644,16 +644,21 @@ skip_regexp_ex(
if (dirc == '?' && newp != NULL && p[1] == '?') if (dirc == '?' && newp != NULL && p[1] == '?')
{ {
// change "\?" to "?", make a copy first. // change "\?" to "?", make a copy first.
if (startplen == 0)
startplen = STRLEN(startp);
if (*newp == NULL) if (*newp == NULL)
{ {
*newp = vim_strnsave(startp, startplen); *newp = vim_strnsave(startp, startplen);
if (*newp != NULL) if (*newp != NULL)
{
p = *newp + (p - startp); p = *newp + (p - startp);
startp = *newp;
}
} }
if (dropped != NULL) if (dropped != NULL)
++*dropped; ++*dropped;
if (*newp != NULL) if (*newp != NULL)
mch_memmove(p, p + 1, (startplen - ((p + 1) - *newp)) + 1); mch_memmove(p, p + 1, startplen - ((p + 1) - startp) + 1);
else else
++p; ++p;
} }

View File

@@ -116,7 +116,16 @@ func Test_global_newline()
close! close!
endfunc endfunc
func Test_wrong_delimiter() " Test :g with ? as delimiter.
func Test_global_question_delimiter()
new
call setline(1, ['aaaaa', 'b?bbb', 'ccccc', 'ddd?d', 'eeeee'])
g?\??delete
call assert_equal(['aaaaa', 'ccccc', 'eeeee'], getline(1, '$'))
bwipe!
endfunc
func Test_global_wrong_delimiter()
call assert_fails('g x^bxd', 'E146:') call assert_fails('g x^bxd', 'E146:')
endfunc endfunc

View File

@@ -174,8 +174,8 @@ func Test_substitute_repeat()
bwipe! bwipe!
endfunc endfunc
" Test :s with ? as separator. " Test :s with ? as delimiter.
func Test_substitute_question_separator() func Test_substitute_question_delimiter()
new new
call setline(1, '??:??') call setline(1, '??:??')
%s?\?\??!!?g %s?\?\??!!?g

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
438,
/**/ /**/
437, 437,
/**/ /**/