Fix various memory leaks (#9)
authorJonathan Dieter <jdieter@gmail.com>
Mon, 30 Jul 2018 21:44:29 +0000 (22:44 +0100)
committerJonathan Dieter <jdieter@gmail.com>
Mon, 30 Jul 2018 21:44:29 +0000 (22:44 +0100)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/lib/header.c
src/zck_delta_size.c
src/zck_dl.c
src/zck_read_header.c
test/empty.c
test/lib/util.c

index c98b6c37073e6139e496d1094892509fc8d36b1e..20be61a6930b3cffaf03b52eff511ebdf1aae065 100644 (file)
@@ -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);
index 962d34d047492a910c001e14903b81e809b13607..ce82222a77ed72ecb1ef1b9aea79ef502e89e820 100644 (file)
@@ -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);
index 5a2c03e360f456f6858facebe280cad63de8ae40..b609b079831c5dd1a3b6b5781e52b10fc0a6e1d2 100644 (file)
@@ -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;
index 3239c2f73a2e378b8fa28c1588e185dbdd34ebf4..b97cc5c37760a5260bd1a081e0c7cda3e08311a2 100644 (file)
@@ -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);
     }
 
index 4f604f64d3849c6e1224060beeb19fd9fa67f9ab..92bf2ae7216324739d0dcbb7abe5eb31bfe1f4bb 100644 (file)
@@ -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;
 }
index 554a693778e98d6efd4cc15339c86f0b25b1aca5..a1152e138485121c8fcd68ad892f253919e6e7bb 100644 (file)
@@ -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;
 }