summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2013-07-23 10:28:04 -0400
committerJunio C Hamano <gitster@pobox.com>2013-07-23 11:37:46 -0700
commitb6679e768f39f718b7f2983d1958f5fb1121f356 (patch)
treef45eaaac6f0ec81d7e45026510b4263c0cbf865e
parent3755b53af779ce75fa3ea4581a0e6525bc67278d (diff)
downloadgit-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>
-rw-r--r--line-log.c6
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 {