diff options
Diffstat (limited to 'diff-delta.c')
-rw-r--r-- | diff-delta.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/diff-delta.c b/diff-delta.c index 464ac3ffc0..3797ce6041 100644 --- a/diff-delta.c +++ b/diff-delta.c @@ -146,9 +146,16 @@ 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++); + for (i = 4; (1u << i) < hsize; i++); hsize = 1 << i; hmask = hsize - 1; |