Skip to content

Commit

Permalink
Merge branch 'jc/zlib-wrap'
Browse files Browse the repository at this point in the history
* jc/zlib-wrap:
  zlib: allow feeding more than 4GB in one go
  zlib: zlib can only process 4GB at a time
  zlib: wrap deflateBound() too
  zlib: wrap deflate side of the API
  zlib: wrap inflateInit2 used to accept only for gzip format
  zlib: wrap remaining calls to direct inflate/inflateEnd
  zlib wrapper: refactor error message formatter

Conflicts:
	sha1_file.c
  • Loading branch information
Junio C Hamano committed Jul 19, 2011
2 parents d37b299 + e01503b commit eb4f407
Show file tree
Hide file tree
Showing 16 changed files with 323 additions and 126 deletions.
10 changes: 5 additions & 5 deletions archive-zip.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,14 @@ static void copy_le32(unsigned char *dest, unsigned int n)
static void *zlib_deflate(void *data, unsigned long size,
int compression_level, unsigned long *compressed_size)
{
z_stream stream;
git_zstream stream;
unsigned long maxsize;
void *buffer;
int result;

memset(&stream, 0, sizeof(stream));
deflateInit(&stream, compression_level);
maxsize = deflateBound(&stream, size);
git_deflate_init(&stream, compression_level);
maxsize = git_deflate_bound(&stream, size);
buffer = xmalloc(maxsize);

stream.next_in = data;
Expand All @@ -106,15 +106,15 @@ static void *zlib_deflate(void *data, unsigned long size,
stream.avail_out = maxsize;

do {
result = deflate(&stream, Z_FINISH);
result = git_deflate(&stream, Z_FINISH);
} while (result == Z_OK);

if (result != Z_STREAM_END) {
free(buffer);
return NULL;
}

deflateEnd(&stream);
git_deflate_end(&stream);
*compressed_size = stream.total_out;

return buffer;
Expand Down
2 changes: 1 addition & 1 deletion builtin/apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -1634,7 +1634,7 @@ static inline int metadata_changes(struct patch *patch)
static char *inflate_it(const void *data, unsigned long size,
unsigned long inflated_size)
{
z_stream stream;
git_zstream stream;
void *out;
int st;

Expand Down
12 changes: 6 additions & 6 deletions builtin/index-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ static void unlink_base_data(struct base_data *c)
static void *unpack_entry_data(unsigned long offset, unsigned long size)
{
int status;
z_stream stream;
git_zstream stream;
void *buf = xmalloc(size);

memset(&stream, 0, sizeof(stream));
Expand Down Expand Up @@ -355,7 +355,7 @@ 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;
z_stream stream;
git_zstream stream;
int status;

data = xmalloc(obj->size);
Expand Down Expand Up @@ -666,26 +666,26 @@ static void parse_pack_objects(unsigned char *sha1)

static int write_compressed(struct sha1file *f, void *in, unsigned int size)
{
z_stream stream;
git_zstream stream;
int status;
unsigned char outbuf[4096];

memset(&stream, 0, sizeof(stream));
deflateInit(&stream, zlib_compression_level);
git_deflate_init(&stream, zlib_compression_level);
stream.next_in = in;
stream.avail_in = size;

do {
stream.next_out = outbuf;
stream.avail_out = sizeof(outbuf);
status = deflate(&stream, Z_FINISH);
status = git_deflate(&stream, Z_FINISH);
sha1write(f, outbuf, sizeof(outbuf) - stream.avail_out);
} while (status == Z_OK);

if (status != Z_STREAM_END)
die("unable to deflate appended object (%d)", status);
size = stream.total_out;
deflateEnd(&stream);
git_deflate_end(&stream);
return size;
}

Expand Down
18 changes: 9 additions & 9 deletions builtin/pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,13 @@ static void *get_delta(struct object_entry *entry)

static unsigned long do_compress(void **pptr, unsigned long size)
{
z_stream stream;
git_zstream stream;
void *in, *out;
unsigned long maxsize;

memset(&stream, 0, sizeof(stream));
deflateInit(&stream, pack_compression_level);
maxsize = deflateBound(&stream, size);
git_deflate_init(&stream, pack_compression_level);
maxsize = git_deflate_bound(&stream, size);

in = *pptr;
out = xmalloc(maxsize);
Expand All @@ -142,9 +142,9 @@ static unsigned long do_compress(void **pptr, unsigned long size)
stream.avail_in = size;
stream.next_out = out;
stream.avail_out = maxsize;
while (deflate(&stream, Z_FINISH) == Z_OK)
while (git_deflate(&stream, Z_FINISH) == Z_OK)
; /* nothing */
deflateEnd(&stream);
git_deflate_end(&stream);

free(in);
return stream.total_out;
Expand All @@ -160,7 +160,7 @@ static int check_pack_inflate(struct packed_git *p,
off_t len,
unsigned long expect)
{
z_stream stream;
git_zstream stream;
unsigned char fakebuf[4096], *in;
int st;

Expand All @@ -187,12 +187,12 @@ static void copy_pack_data(struct sha1file *f,
off_t len)
{
unsigned char *in;
unsigned int avail;
unsigned long avail;

while (len) {
in = use_pack(p, w_curs, offset, &avail);
if (avail > len)
avail = (unsigned int)len;
avail = (unsigned long)len;
sha1write(f, in, avail);
offset += avail;
len -= avail;
Expand Down Expand Up @@ -994,7 +994,7 @@ static void check_object(struct object_entry *entry)
const unsigned char *base_ref = NULL;
struct object_entry *base_entry;
unsigned long used, used_0;
unsigned int avail;
unsigned long avail;
off_t ofs;
unsigned char *buf, c;

Expand Down
2 changes: 1 addition & 1 deletion builtin/unpack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ static void use(int bytes)

static void *get_data(unsigned long size)
{
z_stream stream;
git_zstream stream;
void *buf = xmalloc(size);

memset(&stream, 0, sizeof(stream));
Expand Down
32 changes: 23 additions & 9 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,27 @@
#endif

#include <zlib.h>
#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
#define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
#endif

void git_inflate_init(z_streamp strm);
void git_inflate_end(z_streamp strm);
int git_inflate(z_streamp strm, int flush);
typedef struct git_zstream {
z_stream z;
unsigned long avail_in;
unsigned long avail_out;
unsigned long total_in;
unsigned long total_out;
unsigned char *next_in;
unsigned char *next_out;
} git_zstream;

void git_inflate_init(git_zstream *);
void git_inflate_init_gzip_only(git_zstream *);
void git_inflate_end(git_zstream *);
int git_inflate(git_zstream *, int flush);

void git_deflate_init(git_zstream *, int level);
void git_deflate_init_gzip(git_zstream *, int level);
void git_deflate_end(git_zstream *);
int git_deflate_end_gently(git_zstream *);
int git_deflate(git_zstream *, int flush);
unsigned long git_deflate_bound(git_zstream *, unsigned long);

#if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT)
#define DTYPE(de) ((de)->d_type)
Expand Down Expand Up @@ -753,7 +767,7 @@ extern int write_sha1_file(const void *buf, unsigned long len, const char *type,
extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
extern int force_object_loose(const unsigned char *sha1, time_t mtime);
extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size);
extern int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz);
extern int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz);
extern int parse_sha1_header(const char *hdr, unsigned long *sizep);

/* global flag to enable extra checks when accessing packed objects */
Expand Down Expand Up @@ -984,7 +998,7 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
extern void pack_report(void);
extern int open_pack_index(struct packed_git *);
extern void close_pack_index(struct packed_git *);
extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned int *);
extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *);
extern void close_pack_windows(struct packed_git *);
extern void unuse_pack(struct pack_window **);
extern void free_pack_by_name(const char *);
Expand Down
10 changes: 5 additions & 5 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1861,20 +1861,20 @@ static unsigned char *deflate_it(char *data,
{
int bound;
unsigned char *deflated;
z_stream stream;
git_zstream stream;

memset(&stream, 0, sizeof(stream));
deflateInit(&stream, zlib_compression_level);
bound = deflateBound(&stream, size);
git_deflate_init(&stream, zlib_compression_level);
bound = git_deflate_bound(&stream, size);
deflated = xmalloc(bound);
stream.next_out = deflated;
stream.avail_out = bound;

stream.next_in = (unsigned char *)data;
stream.avail_in = size;
while (deflate(&stream, Z_FINISH) == Z_OK)
while (git_deflate(&stream, Z_FINISH) == Z_OK)
; /* nothing */
deflateEnd(&stream);
git_deflate_end(&stream);
*result_size = stream.total_out;
return deflated;
}
Expand Down
30 changes: 15 additions & 15 deletions fast-import.c
Original file line number Diff line number Diff line change
Expand Up @@ -1017,7 +1017,7 @@ static int store_object(
unsigned char sha1[20];
unsigned long hdrlen, deltalen;
git_SHA_CTX c;
z_stream s;
git_zstream s;

hdrlen = sprintf((char *)hdr,"%s %lu", typename(type),
(unsigned long)dat->len) + 1;
Expand Down Expand Up @@ -1050,19 +1050,19 @@ static int store_object(
delta = NULL;

memset(&s, 0, sizeof(s));
deflateInit(&s, pack_compression_level);
git_deflate_init(&s, pack_compression_level);
if (delta) {
s.next_in = delta;
s.avail_in = deltalen;
} else {
s.next_in = (void *)dat->buf;
s.avail_in = dat->len;
}
s.avail_out = deflateBound(&s, s.avail_in);
s.avail_out = git_deflate_bound(&s, s.avail_in);
s.next_out = out = xmalloc(s.avail_out);
while (deflate(&s, Z_FINISH) == Z_OK)
/* nothing */;
deflateEnd(&s);
while (git_deflate(&s, Z_FINISH) == Z_OK)
; /* nothing */
git_deflate_end(&s);

/* Determine if we should auto-checkpoint. */
if ((max_packsize && (pack_size + 60 + s.total_out) > max_packsize)
Expand All @@ -1078,14 +1078,14 @@ static int store_object(
delta = NULL;

memset(&s, 0, sizeof(s));
deflateInit(&s, pack_compression_level);
git_deflate_init(&s, pack_compression_level);
s.next_in = (void *)dat->buf;
s.avail_in = dat->len;
s.avail_out = deflateBound(&s, s.avail_in);
s.avail_out = git_deflate_bound(&s, s.avail_in);
s.next_out = out = xrealloc(out, s.avail_out);
while (deflate(&s, Z_FINISH) == Z_OK)
/* nothing */;
deflateEnd(&s);
while (git_deflate(&s, Z_FINISH) == Z_OK)
; /* nothing */
git_deflate_end(&s);
}
}

Expand Down Expand Up @@ -1163,7 +1163,7 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
off_t offset;
git_SHA_CTX c;
git_SHA_CTX pack_file_ctx;
z_stream s;
git_zstream s;
int status = Z_OK;

/* Determine if we should auto-checkpoint. */
Expand All @@ -1187,7 +1187,7 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
crc32_begin(pack_file);

memset(&s, 0, sizeof(s));
deflateInit(&s, pack_compression_level);
git_deflate_init(&s, pack_compression_level);

hdrlen = encode_in_pack_object_header(OBJ_BLOB, len, out_buf);
if (out_sz <= hdrlen)
Expand All @@ -1209,7 +1209,7 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
len -= n;
}

status = deflate(&s, len ? 0 : Z_FINISH);
status = git_deflate(&s, len ? 0 : Z_FINISH);

if (!s.avail_out || status == Z_STREAM_END) {
size_t n = s.next_out - out_buf;
Expand All @@ -1228,7 +1228,7 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
die("unexpected deflate failure: %d", status);
}
}
deflateEnd(&s);
git_deflate_end(&s);
git_SHA1_Final(sha1, &c);

if (sha1out)
Expand Down
11 changes: 4 additions & 7 deletions http-backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,16 +271,13 @@ static struct rpc_service *select_service(const char *name)

static void inflate_request(const char *prog_name, int out)
{
z_stream stream;
git_zstream stream;
unsigned char in_buf[8192];
unsigned char out_buf[8192];
unsigned long cnt = 0;
int ret;

memset(&stream, 0, sizeof(stream));
ret = inflateInit2(&stream, (15 + 16));
if (ret != Z_OK)
die("cannot start zlib inflater, zlib err %d", ret);
git_inflate_init_gzip_only(&stream);

while (1) {
ssize_t n = xread(0, in_buf, sizeof(in_buf));
Expand All @@ -296,7 +293,7 @@ static void inflate_request(const char *prog_name, int out)
stream.next_out = out_buf;
stream.avail_out = sizeof(out_buf);

ret = inflate(&stream, Z_NO_FLUSH);
ret = git_inflate(&stream, Z_NO_FLUSH);
if (ret != Z_OK && ret != Z_STREAM_END)
die("zlib error inflating request, result %d", ret);

Expand All @@ -311,7 +308,7 @@ static void inflate_request(const char *prog_name, int out)
}

done:
inflateEnd(&stream);
git_inflate_end(&stream);
close(out);
}

Expand Down
Loading

0 comments on commit eb4f407

Please sign in to comment.