Merge branch 'lk/line-range-parsing-fix' into maint-2.39

When given a pattern that matches an empty string at the end of a
line, the code to parse the "git diff" line-ranges fell into an
infinite loop, which has been corrected.

* lk/line-range-parsing-fix:
  line-range: fix infinite loop bug with '$' regex
This commit is contained in:
Junio C Hamano 2023-02-14 14:15:49 -08:00
commit 725f293355
2 changed files with 26 additions and 3 deletions

View File

@ -135,7 +135,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
{ {
int reg_error; int reg_error;
regmatch_t match[1]; regmatch_t match[1];
while (1) { while (*start) {
const char *bol, *eol; const char *bol, *eol;
reg_error = regexec(regexp, start, 1, match, 0); reg_error = regexec(regexp, start, 1, match, 0);
if (reg_error == REG_NOMATCH) if (reg_error == REG_NOMATCH)
@ -148,8 +148,8 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
/* determine extent of line matched */ /* determine extent of line matched */
bol = start+match[0].rm_so; bol = start+match[0].rm_so;
eol = start+match[0].rm_eo; eol = start+match[0].rm_eo;
while (bol > start && *bol != '\n') while (bol > start && *--bol != '\n')
bol--; ; /* nothing */
if (*bol == '\n') if (*bol == '\n')
bol++; bol++;
while (*eol && *eol != '\n') while (*eol && *eol != '\n')
@ -161,6 +161,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
return bol; return bol;
start = eol; start = eol;
} }
return NULL;
} }
static const char *parse_range_funcname( static const char *parse_range_funcname(

View File

@ -315,4 +315,26 @@ test_expect_success 'line-log with --before' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'setup tests for zero-width regular expressions' '
cat >expect <<-EOF
Modify func1() in file.c
Add func1() and func2() in file.c
EOF
'
test_expect_success 'zero-width regex $ matches any function name' '
git log --format="%s" --no-patch "-L:$:file.c" >actual &&
test_cmp expect actual
'
test_expect_success 'zero-width regex ^ matches any function name' '
git log --format="%s" --no-patch "-L:^:file.c" >actual &&
test_cmp expect actual
'
test_expect_success 'zero-width regex .* matches any function name' '
git log --format="%s" --no-patch "-L:.*:file.c" >actual &&
test_cmp expect actual
'
test_done test_done