diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-03-12 23:21:34 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-03-12 23:21:34 -0700 |
commit | 36d5286f6815542761dae92fdcdce8db1556727f (patch) | |
tree | c17757243d083a95e846e0d701fafebe57513c4a /line-log.c | |
parent | 271513cd549c23d109ccc048627b053bd3691a67 (diff) | |
parent | aaae0bf787f09ba102f69c3cf85d37e6554ab9fd (diff) | |
download | git-36d5286f6815542761dae92fdcdce8db1556727f.tar.gz |
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
Diffstat (limited to 'line-log.c')
-rw-r--r-- | line-log.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/line-log.c b/line-log.c index 65f3558b3b..9510296659 100644 --- a/line-log.c +++ b/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, 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 *rb = b->ranges; /* 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++]; if (new->start == new->end) ; /* 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); - out->ranges[o].start = new->start; - out->ranges[o].end = new->end; - o++; - } else if (out->ranges[o-1].end < new->end) { - out->ranges[o-1].end = new->end; + out->ranges[out->nr].start = new->start; + out->ranges[out->nr].end = new->end; + out->nr++; + } else if (out->ranges[out->nr-1].end < new->end) { + out->ranges[out->nr-1].end = new->end; } } - out->nr = o; } /* |