From 74010f244d27430491a2a231c795816b03fc96c4 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Wed, 25 Jul 2018 15:45:55 +0100 Subject: [PATCH] Fix unzck so it checks the data hash *before* decompressing any chunks Signed-off-by: Jonathan Dieter --- src/lib/comp/comp.c | 4 ++-- src/lib/hash/hash.c | 7 ++++++- src/lib/header.c | 6 +++++- src/lib/log.c | 2 +- src/unzck.c | 13 ++++++++----- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/lib/comp/comp.c b/src/lib/comp/comp.c index e72cbcb..e7c5b4e 100644 --- a/src/lib/comp/comp.c +++ b/src/lib/comp/comp.c @@ -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) { diff --git a/src/lib/hash/hash.c b/src/lib/hash/hash.c index eefd6ef..ff0c964 100644 --- a/src/lib/hash/hash.c +++ b/src/lib/hash/hash.c @@ -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) { diff --git a/src/lib/header.c b/src/lib/header.c index 46d8a7a..1d74984 100644 --- a/src/lib/header.c +++ b/src/lib/header.c @@ -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; } diff --git a/src/lib/log.c b/src/lib/log.c index 5ccf0b6..e03d93a 100644 --- a/src/lib/log.c +++ b/src/lib/log.c @@ -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); diff --git a/src/unzck.c b/src/unzck.c index 11d8e64..4353866 100644 --- a/src/unzck.c +++ b/src/unzck.c @@ -44,7 +44,6 @@ static char args_doc[] = ""; 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); -- 2.30.2