From c00e657df23d9e83d86a79657ff9061b1c2d357b Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 1 Apr 2010 20:03:18 -0400 Subject: [PATCH 1/3] fix const-correctness of write_sha1_file These should take const buffers as input data, but zlib's next_in pointer is not const-correct. Let's fix it at the zlib level, though, so the cast happens in one obvious place. This should be safe, as a similar cast is used in zlib's example code for a const array. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- cache.h | 2 +- sha1_file.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cache.h b/cache.h index 6dcb100a6c..5eb0573bcc 100644 --- a/cache.h +++ b/cache.h @@ -701,7 +701,7 @@ static inline void *read_sha1_file(const unsigned char *sha1, enum object_type * return read_sha1_file_repl(sha1, type, size, NULL); } extern int hash_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1); -extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1); +extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1); 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); diff --git a/sha1_file.c b/sha1_file.c index a08a9d0880..ff65328006 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2271,7 +2271,7 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename) } static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, - void *buf, unsigned long len, time_t mtime) + const void *buf, unsigned long len, time_t mtime) { int fd, ret; unsigned char compressed[4096]; @@ -2307,7 +2307,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, git_SHA1_Update(&c, hdr, hdrlen); /* Then the data itself.. */ - stream.next_in = buf; + stream.next_in = (void *)buf; stream.avail_in = len; do { unsigned char *in0 = stream.next_in; @@ -2342,7 +2342,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, return move_temp_to_file(tmpfile, filename); } -int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *returnsha1) +int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *returnsha1) { unsigned char sha1[20]; char hdr[32]; From b76c056b95ccb15ae3b0723da983914de88b4bae Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 1 Apr 2010 20:04:14 -0400 Subject: [PATCH 2/3] fix textconv leak in emit_rewrite_diff We correctly free() for the normal diff case, but leak for rewrite diffs. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- diff.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/diff.c b/diff.c index 2daa732a36..db2cd5d35f 100644 --- a/diff.c +++ b/diff.c @@ -550,6 +550,10 @@ static void emit_rewrite_diff(const char *name_a, emit_rewrite_lines(&ecbdata, '-', data_one, size_one); if (lc_b) emit_rewrite_lines(&ecbdata, '+', data_two, size_two); + if (textconv_one) + free(data_one); + if (textconv_two) + free(data_two); } struct diff_words_buffer { From aed6ca52e73a35d0aac9aba7d631e09983e46a6f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 8 Apr 2010 23:30:49 -0700 Subject: [PATCH 3/3] diff.c: work around pointer constness warnings The textconv leak fix introduced two invocations of free() to release memory pointed by "const char *", which get annoying compiler warning. --- diff.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diff.c b/diff.c index db2cd5d35f..c23093d6c0 100644 --- a/diff.c +++ b/diff.c @@ -551,9 +551,9 @@ static void emit_rewrite_diff(const char *name_a, if (lc_b) emit_rewrite_lines(&ecbdata, '+', data_two, size_two); if (textconv_one) - free(data_one); + free((char *)data_one); if (textconv_two) - free(data_two); + free((char *)data_two); } struct diff_words_buffer {