Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/index-pack.c | 62 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/builtin/index-pack.c b/builtin/index-pack.c index a47cc34..0dd7193 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -429,33 +429,19 @@ static int is_delta_type(enum object_type type) return (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA); } -static void *unpack_entry_data(unsigned long offset, unsigned long size, - enum object_type type, unsigned char *sha1) +static void read_and_inflate(unsigned long offset, + void *buf, unsigned long size, + unsigned long wraparound, + git_SHA_CTX *ctx, + unsigned char *sha1) { - static char fixed_buf[8192]; - int status; git_zstream stream; - void *buf; - git_SHA_CTX c; - char hdr[32]; - int hdrlen; - - if (!is_delta_type(type)) { - hdrlen = sprintf(hdr, "%s %lu", typename(type), size) + 1; - git_SHA1_Init(&c); - git_SHA1_Update(&c, hdr, hdrlen); - } else - sha1 = NULL; - if (is_delta_type(type) || - (type == OBJ_BLOB && size > big_file_threshold)) - buf = fixed_buf; - else - buf = xmalloc(size); + int status; memset(&stream, 0, sizeof(stream)); git_inflate_init(&stream); stream.next_out = buf; - stream.avail_out = buf == fixed_buf ? sizeof(fixed_buf) : size; + stream.avail_out = wraparound ? wraparound : size; do { unsigned char *last_out = stream.next_out; @@ -464,17 +450,43 @@ static void *unpack_entry_data(unsigned long offset, unsigned long size, status = git_inflate(&stream, 0); use(input_len - stream.avail_in); if (sha1) - git_SHA1_Update(&c, last_out, stream.next_out - last_out); - if (buf == fixed_buf) { + git_SHA1_Update(ctx, last_out, stream.next_out - last_out); + if (wraparound) { stream.next_out = buf; - stream.avail_out = sizeof(fixed_buf); + stream.avail_out = wraparound; } } while (status == Z_OK); if (stream.total_out != size || status != Z_STREAM_END) bad_object(offset, _("inflate returned %d"), status); git_inflate_end(&stream); if (sha1) - git_SHA1_Final(sha1, &c); + git_SHA1_Final(sha1, ctx); +} + +static void *unpack_entry_data(unsigned long offset, unsigned long size, + enum object_type type, unsigned char *sha1) +{ + static char fixed_buf[8192]; + void *buf; + git_SHA_CTX c; + char hdr[32]; + int hdrlen; + + if (!is_delta_type(type)) { + hdrlen = sprintf(hdr, "%s %lu", typename(type), size) + 1; + git_SHA1_Init(&c); + git_SHA1_Update(&c, hdr, hdrlen); + } else + sha1 = NULL; + if (is_delta_type(type) || + (type == OBJ_BLOB && size > big_file_threshold)) + buf = fixed_buf; + else + buf = xmalloc(size); + + read_and_inflate(offset, buf, size, + buf == fixed_buf ? sizeof(fixed_buf) : 0, + &c, sha1); return buf == fixed_buf ? NULL : buf; } -- 1.8.2.83.gc99314b -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html