diff options
author | June McEnroe <june@causal.agency> | 2018-10-28 21:53:53 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2018-10-28 21:53:53 -0400 |
commit | d8da932aa28ec64786eb5d36f442ae6f47804c7a (patch) | |
tree | 2560619355d169c17c52758844f0d335fb02cfa7 | |
parent | Remove other building bindings for engineer (diff) | |
download | src-d8da932aa28ec64786eb5d36f442ae6f47804c7a.tar.gz src-d8da932aa28ec64786eb5d36f442ae6f47804c7a.zip |
Prevent buffer overflows in pngo
Diffstat (limited to '')
-rw-r--r-- | bin/pngo.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/bin/pngo.c b/bin/pngo.c index 209cd10a..d9977c83 100644 --- a/bin/pngo.c +++ b/bin/pngo.c @@ -110,8 +110,12 @@ static void skipChunk(struct Chunk chunk) { if (!(chunk.type[0] & 0x20)) { errx(EX_CONFIG, "%s: unsupported critical chunk %s", path, typeStr(chunk)); } - uint8_t discard[chunk.size]; - readExpect(discard, sizeof(discard), "chunk data"); + uint8_t discard[4096]; + while (chunk.size > sizeof(discard)) { + readExpect(discard, sizeof(discard), "chunk data"); + chunk.size -= sizeof(discard); + } + if (chunk.size) readExpect(discard, chunk.size, "chunk data"); readCrc(); } @@ -307,6 +311,10 @@ static void readPalette(struct Chunk chunk) { } palette.len = chunk.size / 3; + if (palette.len > 256) { + errx(EX_DATAERR, "%s: PLTE length %u > 256", path, palette.len); + } + readExpect(palette.entries, chunk.size, "palette data"); readCrc(); @@ -323,6 +331,9 @@ static void writePalette(void) { static void readTrans(struct Chunk chunk) { trans.len = chunk.size; + if (trans.len > 256) { + errx(EX_DATAERR, "%s: tRNS length %u > 256", path, trans.len); + } readExpect(trans.alpha, chunk.size, "transparency alpha"); readCrc(); if (verbose) fprintf(stderr, "%s: transparency length %u\n", path, trans.len); |