From b027741b242c8fb11d82bb6c47d1e1f49a81841c Mon Sep 17 00:00:00 2001 From: David VomLehn Date: Thu, 2 Apr 2009 16:59:15 -0700 Subject: [PATCH] --- yaml --- r: 139747 b: refs/heads/master c: 98310e581e098514867573031b2bfa4ba89c0d93 h: refs/heads/master i: 139745: c514baa56526f6fa131abb1163df9b1a01dd54e1 139743: ab5938b203d82dca1be9c3f2181b45379f1b5593 v: v3 --- [refs] | 2 +- trunk/fs/cramfs/inode.c | 36 ++++++++++++++++++++++++++---------- trunk/fs/cramfs/uncompress.c | 2 +- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index 312c02f6e4c5..1249d9d1fe8d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6e873ec71d091f52510f6aa9bc71d4732438522a +refs/heads/master: 98310e581e098514867573031b2bfa4ba89c0d93 diff --git a/trunk/fs/cramfs/inode.c b/trunk/fs/cramfs/inode.c index a07338d2d140..46e52980b98a 100644 --- a/trunk/fs/cramfs/inode.c +++ b/trunk/fs/cramfs/inode.c @@ -459,11 +459,14 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s static int cramfs_readpage(struct file *file, struct page * page) { struct inode *inode = page->mapping->host; - u32 maxblock, bytes_filled; + u32 maxblock; + int bytes_filled; void *pgdata; maxblock = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; bytes_filled = 0; + pgdata = kmap(page); + if (page->index < maxblock) { struct super_block *sb = inode->i_sb; u32 blkptr_offset = OFFSET(inode) + page->index*4; @@ -472,30 +475,43 @@ static int cramfs_readpage(struct file *file, struct page * page) start_offset = OFFSET(inode) + maxblock*4; mutex_lock(&read_mutex); if (page->index) - start_offset = *(u32 *) cramfs_read(sb, blkptr_offset-4, 4); - compr_len = (*(u32 *) cramfs_read(sb, blkptr_offset, 4) - start_offset); + start_offset = *(u32 *) cramfs_read(sb, blkptr_offset-4, + 4); + compr_len = (*(u32 *) cramfs_read(sb, blkptr_offset, 4) - + start_offset); mutex_unlock(&read_mutex); - pgdata = kmap(page); + if (compr_len == 0) ; /* hole */ - else if (compr_len > (PAGE_CACHE_SIZE << 1)) - printk(KERN_ERR "cramfs: bad compressed blocksize %u\n", compr_len); - else { + else if (unlikely(compr_len > (PAGE_CACHE_SIZE << 1))) { + pr_err("cramfs: bad compressed blocksize %u\n", + compr_len); + goto err; + } else { mutex_lock(&read_mutex); bytes_filled = cramfs_uncompress_block(pgdata, PAGE_CACHE_SIZE, cramfs_read(sb, start_offset, compr_len), compr_len); mutex_unlock(&read_mutex); + if (unlikely(bytes_filled < 0)) + goto err; } - } else - pgdata = kmap(page); + } + memset(pgdata + bytes_filled, 0, PAGE_CACHE_SIZE - bytes_filled); - kunmap(page); flush_dcache_page(page); + kunmap(page); SetPageUptodate(page); unlock_page(page); return 0; + +err: + kunmap(page); + ClearPageUptodate(page); + SetPageError(page); + unlock_page(page); + return 0; } static const struct address_space_operations cramfs_aops = { diff --git a/trunk/fs/cramfs/uncompress.c b/trunk/fs/cramfs/uncompress.c index fc3ccb74626f..023329800d2e 100644 --- a/trunk/fs/cramfs/uncompress.c +++ b/trunk/fs/cramfs/uncompress.c @@ -50,7 +50,7 @@ int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen) err: printk("Error %d while decompressing!\n", err); printk("%p(%d)->%p(%d)\n", src, srclen, dst, dstlen); - return 0; + return -EIO; } int cramfs_uncompress_init(void)