diff options
author | Eric Sunshine <sunshine@sunshineco.com> | 2013-07-23 10:28:04 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-07-23 11:37:46 -0700 |
commit | b6679e768f39f718b7f2983d1958f5fb1121f356 (patch) | |
tree | f45eaaac6f0ec81d7e45026510b4263c0cbf865e /line-log.c | |
parent | 3755b53af779ce75fa3ea4581a0e6525bc67278d (diff) | |
download | git-b6679e768f39f718b7f2983d1958f5fb1121f356.tar.gz |
range-set: fix sort_and_merge_range_set() corner case bug
When handed an empty range_set (range_set.nr == 0),
sort_and_merge_range_set() incorrectly sets range_set.nr to 1 at exit.
Subsequent range_set functions then access the bogus range at element
zero and crash or throw an assertion failure. Fix this bug.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Acked-by: Thomas Rast <trast@inf.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'line-log.c')
-rw-r--r-- | line-log.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/line-log.c b/line-log.c index 8cc29a0000..52348796c1 100644 --- a/line-log.c +++ b/line-log.c @@ -110,12 +110,12 @@ static void range_set_check_invariants(struct range_set *rs) static void sort_and_merge_range_set(struct range_set *rs) { int i; - int o = 1; /* output cursor */ + int o = 0; /* output cursor */ qsort(rs->ranges, rs->nr, sizeof(struct range), range_cmp); - for (i = 1; i < rs->nr; i++) { - if (rs->ranges[i].start <= rs->ranges[o-1].end) { + for (i = 0; i < rs->nr; i++) { + if (o > 0 && rs->ranges[i].start <= rs->ranges[o-1].end) { if (rs->ranges[o-1].end < rs->ranges[i].end) rs->ranges[o-1].end = rs->ranges[i].end; } else { |