Commit 49f8907f authored by Linus Torvalds's avatar Linus Torvalds Committed by Chris Wright

[PATCH] Check input buffer size in zisofs

Add fakey 'deflateBound()' function to the in-kernel zlib routines

It's not the real deflateBound() in newer zlib libraries, partly because
the upcoming usage of it won't have the "stream" available, so we can't
have the same interfaces anyway.

This uses the new deflateBound() thing to sanity-check the input to the
zlib decompressor before we even bother to start reading in the blocks.

Problem noted by Tim Yamin <plasmaroo@gentoo.org>
Signed-off-by: default avatarChris Wright <chrisw@osdl.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 88560531
...@@ -129,8 +129,14 @@ static int zisofs_readpage(struct file *file, struct page *page) ...@@ -129,8 +129,14 @@ static int zisofs_readpage(struct file *file, struct page *page)
cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask))); cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask)));
brelse(bh); brelse(bh);
if (cstart > cend)
goto eio;
csize = cend-cstart; csize = cend-cstart;
if (csize > deflateBound(1UL << zisofs_block_shift))
goto eio;
/* Now page[] contains an array of pages, any of which can be NULL, /* Now page[] contains an array of pages, any of which can be NULL,
and the locks on which we hold. We should now read the data and and the locks on which we hold. We should now read the data and
release the pages. If the pages are NULL the decompressed data release the pages. If the pages are NULL the decompressed data
......
...@@ -506,6 +506,11 @@ extern int zlib_deflateReset (z_streamp strm); ...@@ -506,6 +506,11 @@ extern int zlib_deflateReset (z_streamp strm);
stream state was inconsistent (such as zalloc or state being NULL). stream state was inconsistent (such as zalloc or state being NULL).
*/ */
static inline unsigned long deflateBound(unsigned long s)
{
return s + ((s + 7) >> 3) + ((s + 63) >> 6) + 11;
}
extern int zlib_deflateParams (z_streamp strm, int level, int strategy); extern int zlib_deflateParams (z_streamp strm, int level, int strategy);
/* /*
Dynamically update the compression level and compression strategy. The Dynamically update the compression level and compression strategy. The
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment