From: Junio C Hamano Date: Mon, 16 Jul 2012 04:40:07 +0000 (-0700) Subject: Merge branch 'jk/index-pack-streaming-fix' X-Git-Tag: v1.7.12-rc0~26 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/37b92a9a2eb1d49409a0b4d16404a3ac265ca723?ds=inline;hp=-c Merge branch 'jk/index-pack-streaming-fix' The streaming index-pack introduced in 1.7.11 had a data corruption bug, and this should fix it. * jk/index-pack-streaming-fix: index-pack: loop while inflating objects in unpack_data --- 37b92a9a2eb1d49409a0b4d16404a3ac265ca723 diff --combined builtin/index-pack.c index 5a0372ab08,50d38767b1..953dd3004e --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@@ -40,8 -40,8 +40,8 @@@ struct base_data int ofs_first, ofs_last; }; -#if !defined(NO_PTHREADS) && defined(NO_PREAD) -/* NO_PREAD uses compat/pread.c, which is not thread-safe. Disable threading. */ +#if !defined(NO_PTHREADS) && defined(NO_THREAD_SAFE_PREAD) +/* pread() emulation is not thread-safe. Disable threading. */ #define NO_PTHREADS #endif @@@ -524,7 -524,6 +524,6 @@@ static void *unpack_data(struct object_ stream.avail_out = consume ? 64*1024 : obj->size; do { - unsigned char *last_out = stream.next_out; ssize_t n = (len < 64*1024) ? len : 64*1024; n = pread(pack_fd, inbuf, n, from); if (n < 0) @@@ -538,15 -537,19 +537,19 @@@ len -= n; stream.next_in = inbuf; stream.avail_in = n; - status = git_inflate(&stream, 0); - if (consume) { - if (consume(last_out, stream.next_out - last_out, cb_data)) { - free(inbuf); - free(data); - return NULL; - } - stream.next_out = data; - stream.avail_out = 64*1024; + if (!consume) + status = git_inflate(&stream, 0); + else { + do { + status = git_inflate(&stream, 0); + if (consume(data, stream.next_out - data, cb_data)) { + free(inbuf); + free(data); + return NULL; + } + stream.next_out = data; + stream.avail_out = 64*1024; + } while (status == Z_OK && stream.avail_in); } } while (len && status == Z_OK && !stream.avail_in);