aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-08-31 16:34:16 -0700
committerJunio C Hamano <gitster@pobox.com>2010-08-31 16:34:16 -0700
commite3efa9c12c1797f5eeb140ebeb44ff6d210ec215 (patch)
tree053fd28b233c7a0bdb264b4ffdc8fe8b3c71e9cd
parent2acf3658a31249d1a09573e2b6870871b5323121 (diff)
parent506049c7df2c68f1db5a4bae502cfb1af0a73048 (diff)
downloadgit-e3efa9c12c1797f5eeb140ebeb44ff6d210ec215.tar.gz
git-e3efa9c12c1797f5eeb140ebeb44ff6d210ec215.tar.xz
Merge branch 'np/maint-huge-delta-generation'
* np/maint-huge-delta-generation: fix >4GiB source delta assertion failure
-rw-r--r--diff-delta.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/diff-delta.c b/diff-delta.c
index 464ac3ffc..93385e12b 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -146,7 +146,14 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
/* Determine index hash size. Note that indexing skips the
first byte to allow for optimizing the Rabin's polynomial
initialization in create_delta(). */
- entries = (bufsize - 1) / RABIN_WINDOW;
+ entries = (bufsize - 1) / RABIN_WINDOW;
+ if (bufsize >= 0xffffffffUL) {
+ /*
+ * Current delta format can't encode offsets into
+ * reference buffer with more than 32 bits.
+ */
+ entries = 0xfffffffeU / RABIN_WINDOW;
+ }
hsize = entries / 4;
for (i = 4; (1u << i) < hsize && i < 31; i++);
hsize = 1 << i;