From: Jonathan Dieter Date: Mon, 30 Jul 2018 21:44:29 +0000 (+0100) Subject: Fix various memory leaks (#9) X-Git-Tag: archive/raspbian/1.1.9+ds1-1+rpi1~1^2~152 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=57e9449a111da1127191c6933b9663d91d1c3cce;p=zchunk.git Fix various memory leaks (#9) Signed-off-by: Jonathan Dieter --- diff --git a/src/lib/header.c b/src/lib/header.c index c98b6c3..20be61a 100644 --- a/src/lib/header.c +++ b/src/lib/header.c @@ -409,8 +409,11 @@ static bool read_lead(zckCtx *zck) { } size_t length = 0; - if(read_data(zck, header, lead) < lead) + if(read_data(zck, header, lead) < lead) { + free(header); + set_error(zck, "Short read"); return false; + } if(memcmp(header, "\0ZCK1", 5) != 0) { free(header); diff --git a/src/zck_delta_size.c b/src/zck_delta_size.c index 962d34d..ce82222 100644 --- a/src/zck_delta_size.c +++ b/src/zck_delta_size.c @@ -116,6 +116,7 @@ int main (int argc, char *argv[]) { if(!zck_init_read(zck_src, src_fd)) { printf("Error reading %s: %s", arguments.args[0], zck_get_error(zck_src)); + zck_free(&zck_src); exit(1); } close(src_fd); @@ -124,16 +125,20 @@ int main (int argc, char *argv[]) { if(tgt_fd < 0) { printf("Unable to open %s\n", arguments.args[1]); perror(""); + zck_free(&zck_src); exit(1); } zckCtx *zck_tgt = zck_create(); if(zck_tgt == NULL) { printf("Unable to create zchunk context\n"); + zck_free(&zck_src); exit(1); } if(!zck_init_read(zck_tgt, tgt_fd)) { printf("Error reading %s: %s", arguments.args[1], zck_get_error(zck_tgt)); + zck_free(&zck_src); + zck_free(&zck_tgt); exit(1); } close(tgt_fd); @@ -142,6 +147,8 @@ int main (int argc, char *argv[]) { printf("ERROR: Chunk hash types don't match:\n"); printf(" %s: %s\n", arguments.args[0], zck_hash_name_from_type(zck_get_chunk_hash_type(zck_tgt))); printf(" %s: %s\n", arguments.args[1], zck_hash_name_from_type(zck_get_chunk_hash_type(zck_src))); + zck_free(&zck_src); + zck_free(&zck_tgt); exit(1); } zckChunk *tgt_idx = zck_get_first_chunk(zck_tgt); diff --git a/src/zck_dl.c b/src/zck_dl.c index 5a2c03e..b609b07 100644 --- a/src/zck_dl.c +++ b/src/zck_dl.c @@ -265,8 +265,6 @@ int dl_header(CURL *curl, zckDL *dl, char *url, int fail_no_ranges, } int main (int argc, char *argv[]) { - curl_global_init(CURL_GLOBAL_ALL); - struct arguments arguments = {0}; /* Defaults */ @@ -274,6 +272,8 @@ int main (int argc, char *argv[]) { argp_parse (&argp, argc, argv, 0, 0, &arguments); + curl_global_init(CURL_GLOBAL_ALL); + zck_set_log_level(arguments.log_level); zckCtx *zck_src = NULL; diff --git a/src/zck_read_header.c b/src/zck_read_header.c index 3239c2f..b97cc5c 100644 --- a/src/zck_read_header.c +++ b/src/zck_read_header.c @@ -128,8 +128,8 @@ int main (int argc, char *argv[]) { exit(1); } if(!zck_init_read(zck, src_fd)) { - printf("%s", zck_get_error(zck)); - printf("Unable to read zchunk header\n"); + printf("Error reading zchunk header: %s", zck_get_error(zck)); + zck_free(&zck); exit(1); } diff --git a/test/empty.c b/test/empty.c index 4f604f6..92bf2ae 100644 --- a/test/empty.c +++ b/test/empty.c @@ -82,6 +82,7 @@ int main (int argc, char *argv[]) { printf("Expected checksum: (SHA-256)%s\n", checksum); exit(1); } + free(cksum); /* Go back to beginning of file and read data from it */ if(lseek(in, 0, SEEK_SET) != 0) { @@ -104,5 +105,7 @@ int main (int argc, char *argv[]) { if(!zck_close(zck)) exit(1); + zck_free(&zck); + free(data); return 0; } diff --git a/test/lib/util.c b/test/lib/util.c index 554a693..a1152e1 100644 --- a/test/lib/util.c +++ b/test/lib/util.c @@ -45,6 +45,8 @@ char *get_hash(char *data, size_t length, int type) { if(digest == NULL) return NULL; zck_free(&zck); - return get_digest_string(digest, hash_type.digest_size); + char *digest_string = get_digest_string(digest, hash_type.digest_size); + free(digest); + return digest_string; }