diff-delta: fix encoding size that would not fit in "unsigned int"
authorMartin Koegler <martin.koegler@chello.at>
Thu, 10 Aug 2017 07:01:01 +0000 (09:01 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Aug 2017 20:55:22 +0000 (13:55 -0700)
The current delta code produces incorrect pack objects for files > 4GB,
because the size is copied from size_t field to "unsigned int" variables
during the encoding process.

Signed-off-by: Martin Koegler <martin.koegler@chello.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-delta.c
index 3797ce6041981d1facda44d3a95d4448dbb8a091..cd238c8ed8fbbd61984b72d1d8018e7ab2a9d29e 100644 (file)
@@ -319,7 +319,9 @@ create_delta(const struct delta_index *index,
             const void *trg_buf, unsigned long trg_size,
             unsigned long *delta_size, unsigned long max_size)
 {
-       unsigned int i, outpos, outsize, moff, msize, val;
+       unsigned int i, val;
+       off_t outpos, moff;
+       size_t l, outsize, msize;
        int inscnt;
        const unsigned char *ref_data, *ref_top, *data, *top;
        unsigned char *out;
@@ -336,20 +338,20 @@ create_delta(const struct delta_index *index,
                return NULL;
 
        /* store reference buffer size */
-       i = index->src_size;
-       while (i >= 0x80) {
-               out[outpos++] = i | 0x80;
-               i >>= 7;
+       l = index->src_size;
+       while (l >= 0x80) {
+               out[outpos++] = l | 0x80;
+               l >>= 7;
        }
-       out[outpos++] = i;
+       out[outpos++] = l;
 
        /* store target buffer size */
-       i = trg_size;
-       while (i >= 0x80) {
-               out[outpos++] = i | 0x80;
-               i >>= 7;
+       l = trg_size;
+       while (l >= 0x80) {
+               out[outpos++] = l | 0x80;
+               l >>= 7;
        }
-       out[outpos++] = i;
+       out[outpos++] = l;
 
        ref_data = index->src_buf;
        ref_top = ref_data + index->src_size;