Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
sha1-lookup: handle duplicates in sha1_pos()
If the first 18 bytes of the SHA1's of all entries are the same then
sha1_pos() dies and reports that the lower and upper limits of the
binary search were the same that this wasn't supposed to happen.  This
is wrong because the remaining two bytes could still differ.

Furthermore: It wouldn't be a problem if they actually were the same,
i.e. if all entries have the same SHA1.  The code already handles
duplicates just fine.  Simply remove the erroneous check.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Oct 1, 2014
1 parent 38d905b commit 0eb0fb8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
2 changes: 0 additions & 2 deletions sha1-lookup.c
Expand Up @@ -84,8 +84,6 @@ int sha1_pos(const unsigned char *sha1, void *table, size_t nr,
die("BUG: assertion failed in binary search");
}
}
if (18 <= ofs)
die("cannot happen -- lo and hi are identical");
}

do {
Expand Down
20 changes: 20 additions & 0 deletions t/t0064-sha1-array.sh
Expand Up @@ -71,4 +71,24 @@ test_expect_success 'lookup non-existing entry with duplicates' '
test "$n" -lt 0
'

test_expect_success 'lookup with almost duplicate values' '
{
echo "append 5555555555555555555555555555555555555555" &&
echo "append 555555555555555555555555555555555555555f" &&
echo20 lookup 55
} | test-sha1-array >actual &&
n=$(cat actual) &&
test "$n" -eq 0
'

test_expect_success 'lookup with single duplicate value' '
{
echo20 append 55 55 &&
echo20 lookup 55
} | test-sha1-array >actual &&
n=$(cat actual) &&
test "$n" -ge 0 &&
test "$n" -le 1
'

test_done

0 comments on commit 0eb0fb8

Please sign in to comment.