Fix unzck so it checks the data hash *before* decompressing any chunks
authorJonathan Dieter <jdieter@gmail.com>
Wed, 25 Jul 2018 14:45:55 +0000 (15:45 +0100)
committerJonathan Dieter <jdieter@gmail.com>
Wed, 25 Jul 2018 14:45:55 +0000 (15:45 +0100)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/lib/comp/comp.c
src/lib/hash/hash.c
src/lib/header.c
src/lib/log.c
src/unzck.c

index e72cbcb11ceb82f4825fddc621a6d980ff4a2eec..e7c5b4e69b9446571b3dffe42511283f91afef2c 100644 (file)
@@ -223,7 +223,7 @@ int comp_init(zckCtx *zck) {
 }
 
 int comp_reset(zckCtx *zck) {
-    VALIDATE_BOOL(zck);
+    _VALIDATE_BOOL(zck);
 
     zck->comp.started = 0;
     if(zck->comp.dc_data) {
@@ -238,7 +238,7 @@ int comp_reset(zckCtx *zck) {
 }
 
 int comp_close(zckCtx *zck) {
-    VALIDATE_BOOL(zck);
+    _VALIDATE_BOOL(zck);
 
     zck_log(ZCK_LOG_DEBUG, "Closing compression");
     if(zck->comp.data) {
index eefd6ef1836478d11ad600823f9519dbeffdd688..ff0c964f8a9ff9455f3eb1ff8bf20bb47373ac5b 100644 (file)
@@ -462,7 +462,12 @@ int PUBLIC zck_validate_data_checksum(zckCtx *zck) {
         }
         idx = idx->next;
     }
-    return validate_file(zck, ZCK_LOG_WARNING);
+    int ret = validate_file(zck, ZCK_LOG_WARNING);
+    if(!seek_data(zck, zck->data_offset, SEEK_SET))
+        return 0;
+    if(!hash_init(zck, &(zck->check_full_hash), &(zck->hash_type)))
+        return 0;
+    return ret;
 }
 
 const char PUBLIC *zck_hash_name_from_type(int hash_type) {
index 46d8a7a3d549d443a58e7ac67530f7b85d204a5a..1d74984b960476f68ad263c35f2903bb4f63cf43 100644 (file)
@@ -82,8 +82,12 @@ static int read_header_from_file(zckCtx *zck) {
         return False;
     if(!hash_update(zck, &(zck->check_full_hash), header, zck->header_length))
         return False;
-    if(validate_header(zck) < 1)
+    int ret = validate_header(zck);
+    if(ret < 1) {
+        if(ret == -1)
+            set_fatal_error(zck, "Header checksum failed verification");
         return False;
+    }
     return True;
 }
 
index 5ccf0b6ef5cf9952fb5462236dd1ca5eeb7bbf6e..e03d93a8f2b7bdd7ecfa8a587b2c99b45c27ce56 100644 (file)
@@ -45,7 +45,7 @@ void PUBLIC zck_set_log_fd(int fd) {
 
 void zck_log_v(const char *function, zck_log_type lt, const char *format,
      va_list args) {
-    if(lt < log_level)
+    if(lt < log_level || log_level == ZCK_LOG_ERROR)
         return;
 
     dprintf(log_fd, "%s: ", function);
index 11d8e64da049cb715472180e0658a10e38c0ba6f..4353866390118264114fda006d1cc4d8447b0085 100644 (file)
@@ -44,7 +44,6 @@ static char args_doc[] = "<file>";
 static struct argp_option options[] = {
     {"verbose", 'v', 0,        0,
      "Increase verbosity (can be specified more than once for debugging)"},
-    {"quiet",   'q', 0,        0, "Only show errors"},
     {"stdout",  'c', 0,        0, "Direct output to stdout"},
     {"version", 'V', 0,        0, "Show program version"},
     { 0 }
@@ -65,9 +64,6 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
             if(arguments->log_level < ZCK_LOG_DDEBUG)
                 arguments->log_level = ZCK_LOG_DDEBUG;
             break;
-        case 'q':
-            arguments->log_level = ZCK_LOG_ERROR;
-            break;
         case 'c':
             arguments->stdout = 1;
             break;
@@ -103,7 +99,7 @@ int main (int argc, char *argv[]) {
     struct arguments arguments = {0};
 
     /* Defaults */
-    arguments.log_level = ZCK_LOG_WARNING;
+    arguments.log_level = ZCK_LOG_ERROR;
 
     argp_parse (&argp, argc, argv, 0, 0, &arguments);
 
@@ -140,6 +136,13 @@ int main (int argc, char *argv[]) {
     if(!zck_init_read(zck, src_fd))
         goto error2;
 
+    int ret = zck_validate_data_checksum(zck);
+    if(ret < 1) {
+        if(ret == -1)
+            printf("Data checksum failed verification\n");
+        goto error2;
+    }
+
     size_t total = 0;
     while(True) {
         ssize_t read = zck_read(zck, data, BUF_SIZE);