:: commit ce4711f99e18310860fe63ea3519e8e5cdd2c9c4

Kamila Szewczyk <27734421+kspalaiologos@users.noreply.github.com> — 2023-05-18 18:57

parents: 19ac7d4ffa

Fix a bug reported by Adam Borowski wrt. fread() checks in tool's decompression code.

diff --git a/src/main.c b/src/main.c
index bffd798..65d5e94 100644
--- a/src/main.c
+++ b/src/main.c
@@ -244,7 +244,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 new_size = read_neutral_s32(byteswap_buf);
                 xread_noeof(&byteswap_buf, 1, 4, input_des);
                 old_size = read_neutral_s32(byteswap_buf);
-                if (old_size > block_size + 31) {
+                if (old_size > block_size || new_size > block_size + 31) {
                     fprintf(stderr, "Failed to decode a block: Inconsistent headers.\n");
                     return 1;
                 }
@@ -265,7 +265,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 new_size = read_neutral_s32(byteswap_buf);
                 xread_noeof(&byteswap_buf, 1, 4, input_des);
                 old_size = read_neutral_s32(byteswap_buf);
-                if (old_size > block_size + 31) {
+                if (old_size > block_size || new_size > block_size + 31) {
                     fprintf(stderr, "Failed to decode a block: Inconsistent headers.\n");
                     return 1;
                 }
@@ -342,7 +342,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                     sizes[i] = read_neutral_s32(byteswap_buf);
                     xread_noeof(&byteswap_buf, 1, 4, input_des);
                     old_sizes[i] = read_neutral_s32(byteswap_buf);
-                    if (old_sizes[i] > block_size + 31) {
+                    if (old_sizes[i] > block_size || sizes[i] > block_size + 31) {
                         fprintf(stderr, "Failed to decode a block: Inconsistent headers.\n");
                         return 1;
                     }
@@ -370,7 +370,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                     sizes[i] = read_neutral_s32(byteswap_buf);
                     xread_noeof(&byteswap_buf, 1, 4, input_des);
                     old_sizes[i] = read_neutral_s32(byteswap_buf);
-                    if (old_sizes[i] > block_size + 31) {
+                    if (old_sizes[i] > block_size || sizes[i] > block_size + 31) {
                         fprintf(stderr, "Failed to decode a block: Inconsistent headers.\n");
                         return 1;
                     }
tab: 248 wrap: offon