static void *get_data(unsigned long size) { git_zstream stream; void *buf = xmalloc(size); memset(&stream, 0, sizeof(stream)); stream.next_out = buf; stream.avail_out = size; stream.next_in = fill(1); stream.avail_in = len; git_inflate_init(&stream); for (;;) { int ret = git_inflate(&stream, 0); use(len - stream.avail_in); if (stream.total_out == size && ret == Z_STREAM_END) break; if (ret != Z_OK) { error("inflate returned %d", ret); free(buf); buf = NULL; if (!recover) exit(1); has_errors = 1; break; } stream.next_in = fill(1); stream.avail_in = len; } git_inflate_end(&stream); return buf; }
static read_method_decl(pack_non_delta) { size_t total_read = 0; switch (st->z_state) { case z_unused: memset(&st->z, 0, sizeof(st->z)); git_inflate_init(&st->z); st->z_state = z_used; break; case z_done: return 0; case z_error: return -1; case z_used: break; } while (total_read < sz) { int status; struct pack_window *window = NULL; unsigned char *mapped; mapped = use_pack(st->u.in_pack.pack, &window, st->u.in_pack.pos, &st->z.avail_in); st->z.next_out = (unsigned char *)buf + total_read; st->z.avail_out = sz - total_read; st->z.next_in = mapped; status = git_inflate(&st->z, Z_FINISH); st->u.in_pack.pos += st->z.next_in - mapped; total_read = st->z.next_out - (unsigned char *)buf; unuse_pack(&window); if (status == Z_STREAM_END) { git_inflate_end(&st->z); st->z_state = z_done; break; } if (status != Z_OK && status != Z_BUF_ERROR) { git_inflate_end(&st->z); st->z_state = z_error; return -1; } } return total_read; }
static void *get_data_from_pack(struct object_entry *obj) { off_t from = obj[0].idx.offset + obj[0].hdr_size; unsigned long len = obj[1].idx.offset - from; unsigned char *data, *inbuf; git_zstream stream; int status; data = xmalloc(obj->size); inbuf = xmalloc((len < 64*1024) ? len : 64*1024); memset(&stream, 0, sizeof(stream)); git_inflate_init(&stream); stream.next_out = data; stream.avail_out = obj->size; do { ssize_t n = (len < 64*1024) ? len : 64*1024; n = pread(pack_fd, inbuf, n, from); if (n < 0) die_errno(_("cannot pread pack file")); if (!n) die(Q_("premature end of pack file, %lu byte missing", "premature end of pack file, %lu bytes missing", len), len); from += n; len -= n; stream.next_in = inbuf; stream.avail_in = n; status = git_inflate(&stream, 0); } while (len && status == Z_OK && !stream.avail_in); /* This has been inflated OK when first encountered, so... */ if (status != Z_STREAM_END || stream.total_out != obj->size) die(_("serious inflate inconsistency")); git_inflate_end(&stream); free(inbuf); return data; }
static void *unpack_entry_data(unsigned long offset, unsigned long size) { int status; z_stream stream; void *buf = xmalloc(size); memset(&stream, 0, sizeof(stream)); git_inflate_init(&stream); stream.next_out = buf; stream.avail_out = size; do { stream.next_in = fill(1); stream.avail_in = input_len; status = git_inflate(&stream, 0); use(input_len - stream.avail_in); } while (status == Z_OK); if (stream.total_out != size || status != Z_STREAM_END) bad_object(offset, "inflate returned %d", status); git_inflate_end(&stream); return buf; }