Fix memory leak and error when closing after error
authorJonathan Dieter <jdieter@gmail.com>
Sat, 1 Dec 2018 17:30:30 +0000 (17:30 +0000)
committerJonathan Dieter <jdieter@gmail.com>
Sat, 1 Dec 2018 17:30:30 +0000 (17:30 +0000)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/lib/comp/nocomp/nocomp.c
src/lib/comp/zstd/zstd.c
src/lib/zck.c
test/invalid_input_checksum.c

index 60ed9e7ebcf1da7c4a5493cc35f11d8c9b5267d7..0b9f85a57eed21fe36789004e34fd4d7c99da0b8 100644 (file)
@@ -94,7 +94,7 @@ static bool end_dchunk(zckCtx *zck, zckComp *comp, const bool use_dict,
 }
 
 static bool close(zckCtx *zck, zckComp *comp) {
-    VALIDATE_BOOL(zck);
+    ALLOCD_BOOL(zck, zck);
     ALLOCD_BOOL(zck, comp);
 
     return true;
index 1e98b4f287770f6860d520607de4f88c7f721ddf..920a6117134c761bc5c0ba5db3e3a2fcef611c5a 100644 (file)
@@ -58,7 +58,7 @@ static bool init(zckCtx *zck, zckComp *comp) {
 }
 
 static bool close(zckCtx *zck, zckComp *comp) {
-    VALIDATE_BOOL(zck);
+    ALLOCD_BOOL(zck, zck);
     ALLOCD_BOOL(zck, comp);
 
     if(comp->cdict_ctx) {
index 624416db8714fb0f450263c1a1b97180d2944ccd..dc4e183cab2c7407a92d926ec239393320ed0717 100644 (file)
@@ -93,12 +93,12 @@ static int hex_to_int (char c) {
     return result;
 }
 
-static char *ascii_checksum_to_bin (zckCtx *zck, char *checksum) {
-    int cl = strlen(checksum);
-    char *raw_checksum = zmalloc(cl/2);
+static char *ascii_checksum_to_bin (zckCtx *zck, char *checksum,
+                                    int checksum_length) {
+    char *raw_checksum = zmalloc(checksum_length/2);
     char *rp = raw_checksum;
     int buf = 0;
-    for (int i=0; i<cl; i++) {
+    for (int i=0; i<checksum_length; i++) {
         // Get integer value of hex checksum character.  If -1 is returned, then
         // the character wasn't actually hex, so return NULL
         int cksum = hex_to_int(checksum[i]);
@@ -230,7 +230,7 @@ bool PUBLIC zck_set_soption(zckCtx *zck, zck_soption option, const char *value,
         }
         zck_log(ZCK_LOG_DEBUG, "Setting expected hash to (%s)%s",
                 zck_hash_name_from_type(zck->prep_hash_type), data);
-        zck->prep_digest = ascii_checksum_to_bin(zck, data);
+        zck->prep_digest = ascii_checksum_to_bin(zck, data, length);
         free(data);
         if(zck->prep_digest == NULL) {
             set_fatal_error(zck, "Non-hex character found in supplied digest");
index 9b4f10936b6eea3f8f85e6dd3dc92087a1444274..0e08081f0916a3f0eb055803b8a3def27fe376fa 100644 (file)
@@ -60,7 +60,9 @@ int main (int argc, char *argv[]) {
             "gbcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789",
             64)) {
         printf("ERROR: setting invalid checksum *worked*\n");
+        zck_free(&zck);
         exit(1);
     }
+    zck_free(&zck);
     printf("%s", zck_get_error(zck));
 }