diff options
| author | B. Watson <urchlay@slackware.uk> | 2025-11-14 21:55:28 -0500 |
|---|---|---|
| committer | B. Watson <urchlay@slackware.uk> | 2025-11-14 21:55:28 -0500 |
| commit | e25aa2fa57bcd21450eabc54cb303812c0538ce6 (patch) | |
| tree | 12dcc851e75f20fb29dfda11f944acc0c80bf684 /src | |
| parent | 17f5db60f8475b58485599a1324c60c9f1a65ffa (diff) | |
| download | unalf-e25aa2fa57bcd21450eabc54cb303812c0538ce6.tar.gz | |
Sanity-check header sizes.
Diffstat (limited to 'src')
| -rw-r--r-- | src/io.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -20,6 +20,33 @@ static void eof_junk(void) { fprintf(stderr, "%s: junk at EOF (ignoring)\n", self); } +static void check_hdr_size(const char *name, unsigned long size) { + const char *desc; + + /* fits on a double-density disk? */ + if(size < 184320) + return; + + /* >= 16MB files are impossible because the decrunch algorithm + ignores the high byte of the 4-byte length. */ + if(size >= 16777216L) + desc = "impossibly large (>=16MB)"; + /* >1MB files are possible (e.g. with a hard drive on SpartaDOS X) + but exceedingly rare in the Atari world. */ + else if(size > 1048576L) + desc = "suspiciously large (>1MB)"; + else + desc = "too large for a floppy disk (>180KB)"; + + fprintf(stderr, "%s: header #%d %s size is %s.\n", + self, headers_read, name, desc); +} + +static void sanity_check_header(void) { + check_hdr_size("original", getquad(alf_hdr_origsize0)); + check_hdr_size("compressed", getquad(alf_hdr_compsize0)); +} + /* return 1 if a header is read, 0 if not */ int read_alf_header(void) { u8 h1, h2; @@ -48,6 +75,7 @@ int read_alf_header(void) { if(h2 < 0x0f) die_arc(); if(h2 == 0x0f) { headers_read++; + sanity_check_header(); return 1; /* signature matches */ } } |
