Merge branch 'ax/line-log-range-merge-fix'
The code to parse "git log -L..." command line was buggy when there are many ranges specified with -L; overrun of the allocated buffer has been fixed. * ax/line-log-range-merge-fix: line-log.c: prevent crash during union of too many ranges
This commit is contained in:
commit
36d5286f68
15
line-log.c
15
line-log.c
@ -144,7 +144,7 @@ void sort_and_merge_range_set(struct range_set *rs)
|
|||||||
static void range_set_union(struct range_set *out,
|
static void range_set_union(struct range_set *out,
|
||||||
struct range_set *a, struct range_set *b)
|
struct range_set *a, struct range_set *b)
|
||||||
{
|
{
|
||||||
int i = 0, j = 0, o = 0;
|
int i = 0, j = 0;
|
||||||
struct range *ra = a->ranges;
|
struct range *ra = a->ranges;
|
||||||
struct range *rb = b->ranges;
|
struct range *rb = b->ranges;
|
||||||
/* cannot make an alias of out->ranges: it may change during grow */
|
/* cannot make an alias of out->ranges: it may change during grow */
|
||||||
@ -167,16 +167,15 @@ static void range_set_union(struct range_set *out,
|
|||||||
new = &rb[j++];
|
new = &rb[j++];
|
||||||
if (new->start == new->end)
|
if (new->start == new->end)
|
||||||
; /* empty range */
|
; /* empty range */
|
||||||
else if (!o || out->ranges[o-1].end < new->start) {
|
else if (!out->nr || out->ranges[out->nr-1].end < new->start) {
|
||||||
range_set_grow(out, 1);
|
range_set_grow(out, 1);
|
||||||
out->ranges[o].start = new->start;
|
out->ranges[out->nr].start = new->start;
|
||||||
out->ranges[o].end = new->end;
|
out->ranges[out->nr].end = new->end;
|
||||||
o++;
|
out->nr++;
|
||||||
} else if (out->ranges[o-1].end < new->end) {
|
} else if (out->ranges[out->nr-1].end < new->end) {
|
||||||
out->ranges[o-1].end = new->end;
|
out->ranges[out->nr-1].end = new->end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out->nr = o;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -106,4 +106,14 @@ test_expect_success '-L with --output' '
|
|||||||
test_line_count = 70 log
|
test_line_count = 70 log
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'range_set_union' '
|
||||||
|
test_seq 500 > c.c &&
|
||||||
|
git add c.c &&
|
||||||
|
git commit -m "many lines" &&
|
||||||
|
test_seq 1000 > c.c &&
|
||||||
|
git add c.c &&
|
||||||
|
git commit -m "modify many lines" &&
|
||||||
|
git log $(for x in $(test_seq 200); do echo -L $((2*x)),+1:c.c; done)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user