зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
3755b53af7
Коммит
b6679e768f
|
@ -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)
|
static void sort_and_merge_range_set(struct range_set *rs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int o = 1; /* output cursor */
|
int o = 0; /* output cursor */
|
||||||
|
|
||||||
qsort(rs->ranges, rs->nr, sizeof(struct range), range_cmp);
|
qsort(rs->ranges, rs->nr, sizeof(struct range), range_cmp);
|
||||||
|
|
||||||
for (i = 1; i < rs->nr; i++) {
|
for (i = 0; i < rs->nr; i++) {
|
||||||
if (rs->ranges[i].start <= rs->ranges[o-1].end) {
|
if (o > 0 && rs->ranges[i].start <= rs->ranges[o-1].end) {
|
||||||
if (rs->ranges[o-1].end < rs->ranges[i].end)
|
if (rs->ranges[o-1].end < rs->ranges[i].end)
|
||||||
rs->ranges[o-1].end = rs->ranges[i].end;
|
rs->ranges[o-1].end = rs->ranges[i].end;
|
||||||
} else {
|
} else {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче