From 1d32c57442f6b72c69ebdac69a068da10fc195f0 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Wed, 1 Oct 2014 18:36:33 +0000 Subject: Apply the same Deflate decoder fix as PuTTY r10278. This causes sensible error reporting if distance codes 30 or 31 appear in a compressed block. (Not that Halibut actually _uses_ the Deflate decoder - it only uses the encoder - but if I've got a copy of this code here then it should be correct.) [originally from svn r10280] [r10278 == 3fd8014ea7235d0ec34e8f97a34f3ecf576e8239 in putty repository] --- deflate.c | 4 ++++ deflate.h | 1 + 2 files changed, 5 insertions(+) diff --git a/deflate.c b/deflate.c index 5eb1faa..7c3f3bc 100644 --- a/deflate.c +++ b/deflate.c @@ -2417,6 +2417,10 @@ int deflate_decompress_data(deflate_decompress_ctx *dctx, debug(("recv: dist %d\n", code)); if (code == -1) goto finished; + if (code >= 30) { + error = DEFLATE_ERR_BADDISTCODE; + goto finished; + } dctx->state = GOTDISTSYM; dctx->sym = code; break; diff --git a/deflate.h b/deflate.h index 140626f..fcd2cd1 100644 --- a/deflate.h +++ b/deflate.h @@ -152,6 +152,7 @@ int deflate_decompress_data(deflate_decompress_ctx *ctx, A(DEFLATE_ERR_LARGE_HUFTABLE, "over-committed Huffman code space"), \ A(DEFLATE_ERR_UNCOMP_HDR, "wrongly formatted header in uncompressed block"), \ A(DEFLATE_ERR_NODISTTABLE, "backward copy encoded in block without distances table"), \ + A(DEFLATE_ERR_BADDISTCODE, "invalid distance code 30 or 31 found in block"), \ A(DEFLATE_ERR_CHECKSUM, "incorrect data checksum"), \ A(DEFLATE_ERR_INLEN, "incorrect data length"), \ A(DEFLATE_ERR_UNEXPECTED_EOF, "unexpected end of data") -- cgit v1.1