Skip to content

Commit 725f293

Browse files
committed
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
2 parents a67610f + 4e57c88 commit 725f293

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

line-range.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
135135
{
136136
int reg_error;
137137
regmatch_t match[1];
138-
while (1) {
138+
while (*start) {
139139
const char *bol, *eol;
140140
reg_error = regexec(regexp, start, 1, match, 0);
141141
if (reg_error == REG_NOMATCH)
@@ -148,8 +148,8 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
148148
/* determine extent of line matched */
149149
bol = start+match[0].rm_so;
150150
eol = start+match[0].rm_eo;
151-
while (bol > start && *bol != '\n')
152-
bol--;
151+
while (bol > start && *--bol != '\n')
152+
; /* nothing */
153153
if (*bol == '\n')
154154
bol++;
155155
while (*eol && *eol != '\n')
@@ -161,6 +161,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
161161
return bol;
162162
start = eol;
163163
}
164+
return NULL;
164165
}
165166

166167
static const char *parse_range_funcname(

t/t4211-line-log.sh

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,26 @@ test_expect_success 'line-log with --before' '
315315
test_cmp expect actual
316316
'
317317

318+
test_expect_success 'setup tests for zero-width regular expressions' '
319+
cat >expect <<-EOF
320+
Modify func1() in file.c
321+
Add func1() and func2() in file.c
322+
EOF
323+
'
324+
325+
test_expect_success 'zero-width regex $ matches any function name' '
326+
git log --format="%s" --no-patch "-L:$:file.c" >actual &&
327+
test_cmp expect actual
328+
'
329+
330+
test_expect_success 'zero-width regex ^ matches any function name' '
331+
git log --format="%s" --no-patch "-L:^:file.c" >actual &&
332+
test_cmp expect actual
333+
'
334+
335+
test_expect_success 'zero-width regex .* matches any function name' '
336+
git log --format="%s" --no-patch "-L:.*:file.c" >actual &&
337+
test_cmp expect actual
338+
'
339+
318340
test_done

0 commit comments

Comments
 (0)