line-range: fix infinite loop bug with '$' regex
When the -L argument to "git log" is passed the zero-width regular expression "$" (as in "-L :$:line-range.c"), this results in an infinite loop in find_funcname_matching_regexp(). Modify find_funcname_matching_regexp to correctly match the entire line instead of the zero-width match at eol and update the loop condition to prevent an infinite loop in the event of other undiscovered corner cases. The primary change is that we pre-decrement the beginning-of-line marker ('bol') before comparing it to '\n'. In the case of '$', where we match the '\n' at the end of the line and start the loop with bol == eol, this ensures that bol will find the beginning of the line on which the match occurred. Originally reported in <https://stackoverflow.com/q/74690545/147356>. Signed-off-by: Lars Kellogg-Stedman <lars@oddbit.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
8706a59933
commit
4e57c88e02
@ -135,7 +135,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
|
||||
{
|
||||
int reg_error;
|
||||
regmatch_t match[1];
|
||||
while (1) {
|
||||
while (*start) {
|
||||
const char *bol, *eol;
|
||||
reg_error = regexec(regexp, start, 1, match, 0);
|
||||
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 */
|
||||
bol = start+match[0].rm_so;
|
||||
eol = start+match[0].rm_eo;
|
||||
while (bol > start && *bol != '\n')
|
||||
bol--;
|
||||
while (bol > start && *--bol != '\n')
|
||||
; /* nothing */
|
||||
if (*bol == '\n')
|
||||
bol++;
|
||||
while (*eol && *eol != '\n')
|
||||
@ -161,6 +161,7 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
|
||||
return bol;
|
||||
start = eol;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *parse_range_funcname(
|
||||
|
Reference in New Issue
Block a user