X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=sha1_file.c;h=d98b265bbbb6dbf222877a41bcde43eb3b5a9158;hb=86436c28289eedd2ee9b7f9c872a0ed039866a0f;hp=97a515a073fec5870dfaaa279868ce9330853d3d;hpb=8237b1854c64492ab5772994b4ac4efd7f1c2fc0;p=git.git diff --git a/sha1_file.c b/sha1_file.c index 97a515a0..d98b265b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -155,6 +155,8 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l inflateInit(&stream); ret = inflate(&stream, 0); + if (ret < Z_OK) + return NULL; if (sscanf(buffer, "%10s %lu", type, size) != 2) return NULL; @@ -229,7 +231,7 @@ void *read_tree_with_tree_or_commit_sha1(const unsigned char *sha1, return buffer; } -int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1) +int write_sha1_file(char *buf, unsigned long len, const char *type, unsigned char *returnsha1) { int size; char *compressed; @@ -237,10 +239,15 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1) unsigned char sha1[20]; SHA_CTX c; char *filename; - int fd; + char hdr[50]; + int fd, hdrlen; + + /* Generate the header */ + hdrlen = sprintf(hdr, "%s %lu", type, len)+1; /* Sha1.. */ SHA1_Init(&c); + SHA1_Update(&c, hdr, hdrlen); SHA1_Update(&c, buf, len); SHA1_Final(sha1, &c); @@ -263,14 +270,22 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1) /* Set it up */ memset(&stream, 0, sizeof(stream)); deflateInit(&stream, Z_BEST_COMPRESSION); - size = deflateBound(&stream, len); + size = deflateBound(&stream, len+hdrlen); compressed = malloc(size); /* Compress it */ - stream.next_in = buf; - stream.avail_in = len; stream.next_out = compressed; stream.avail_out = size; + + /* First header.. */ + stream.next_in = hdr; + stream.avail_in = hdrlen; + while (deflate(&stream, 0) == Z_OK) + /* nothing */ + + /* Then the data itself.. */ + stream.next_in = buf; + stream.avail_in = len; while (deflate(&stream, Z_FINISH) == Z_OK) /* nothing */; deflateEnd(&stream);