Add an error check for correct formatting in Deflate uncompressed
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 3 May 2012 17:38:08 +0000 (17:38 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 3 May 2012 17:38:08 +0000 (17:38 +0000)
block headers. (Ubuntu 12.04's gcc spotted that nlen was unused, which
it shouldn't have been.)

git-svn-id: svn://svn.tartarus.org/sgt/halibut@9475 cda61777-01e9-0310-a592-d414129be87e

deflate.c
deflate.h

index ecae0d0..a04f86d 100644 (file)
--- a/deflate.c
+++ b/deflate.c
@@ -2441,8 +2441,12 @@ int deflate_decompress_data(deflate_decompress_ctx *dctx,
             */
            if (dctx->nbits < 16)
                goto finished;
-           nlen = dctx->bits & 0xFFFF;
+           nlen = 0xFFFF & ~dctx->bits;
            EATBITS(16);
+           if (dctx->uncomplen != (nlen ^ 0xFFFF)) {
+                error = DEFLATE_ERR_UNCOMP_HDR;
+                goto finished;
+            }
            if (dctx->uncomplen == 0)
                dctx->state = OUTSIDEBLK;       /* block is empty */
            else
index 80837f9..6f51407 100644 (file)
--- a/deflate.h
+++ b/deflate.h
@@ -150,6 +150,7 @@ int deflate_decompress_data(deflate_decompress_ctx *ctx,
     A(DEFLATE_ERR_GZIP_FHCRC, "gzip header specifies disputed FHCRC flag"), \
     A(DEFLATE_ERR_SMALL_HUFTABLE, "under-committed Huffman code space"), \
     A(DEFLATE_ERR_LARGE_HUFTABLE, "over-committed Huffman code space"), \
+    A(DEFLATE_ERR_UNCOMP_HDR, "wrongly formatted header in uncompressed block"), \
     A(DEFLATE_ERR_CHECKSUM, "incorrect data checksum"), \
     A(DEFLATE_ERR_INLEN, "incorrect data length"), \
     A(DEFLATE_ERR_UNEXPECTED_EOF, "unexpected end of data")