From 664a630518f8f92a8b262e973790bbdb0dfc33ad Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Wed, 26 Nov 2025 05:44:24 -0500 Subject: alf: Bounds checking on input and output sizes. Document unalf bug with files >=15MB. Use atarified filename in 'Crunching' message. --- src/alf.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/alf.c') diff --git a/src/alf.c b/src/alf.c index 12aafad..c3b210d 100644 --- a/src/alf.c +++ b/src/alf.c @@ -26,7 +26,7 @@ u8 input_buf[MAX_INPUT_SIZE]; u8 output_buf[MAX_INPUT_SIZE]; u8 byte_tokens[256]; -int input_len, output_len, out_bitpos; +unsigned int input_len, output_len, out_bitpos; int opt_append = 0; int opt_overwrite = 0; @@ -145,6 +145,7 @@ void create_header(void) { char hdr_filename[13]; atarify_filename(hdr_filename); + printf("Crunching %s\n", hdr_filename); output_buf[0] = 0x1a; output_buf[1] = 0x0f; @@ -169,12 +170,19 @@ void open_input(const char *filename) { } } +void inc_output_len(void) { + if(++output_len == MAX_INPUT_SIZE) { + fprintf(stderr, "%s: fatal: compressed file would be >16MB.\n", self); + exit(1); + } +} + void append_bit(int bit) { output_buf[output_len] |= (bit << (7 - out_bitpos)); out_bitpos++; if(out_bitpos == 8) { out_bitpos = 0; - output_len++; + inc_output_len(); } } @@ -244,18 +252,20 @@ void crunch(void) { } store_token(TOK_END); - if(out_bitpos) output_len++; + if(out_bitpos) inc_output_len(); update_header(); } void crunch_file(const char *filename) { init_table(); - printf("Crunching %s\n", filename); open_input(filename); /* read in entire input, couldn't do it this way on the Atari */ input_len = fread(input_buf, 1, MAX_INPUT_SIZE - 1, in_file); + if(!feof(in_file)) { + fprintf(stderr, "%s: warning: this file is too large; only compressing the first 16MB.\n", self); + } output_len = 0; fstat(fileno(in_file), &in_file_stat); /* for timestamp */ fclose(in_file); -- cgit v1.2.3