diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-08 13:21:31 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-08 13:21:31 -0400 |
| commit | d0cdb070ced5453fd1790d83c32bdc59d8ff9375 (patch) | |
| tree | de5f030136e7be478564514ecf2375abe70007fb | |
| parent | 153d8a122e04d285aaee0ba00af7564182b7b6de (diff) | |
| parent | f4f8056a862a9950320429dfda708c88b4ce6025 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus
* git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus:
Squashfs: frag_size should be signed, as it can hold an error result
Squashfs: fix documentation typo, Cramfs filesystem limit is 256 MiB
Squashfs: Fix oops when reading fsfuzzer corrupted filesystems
| -rw-r--r-- | Documentation/filesystems/squashfs.txt | 2 | ||||
| -rw-r--r-- | fs/squashfs/block.c | 13 | ||||
| -rw-r--r-- | fs/squashfs/cache.c | 4 | ||||
| -rw-r--r-- | fs/squashfs/inode.c | 6 | ||||
| -rw-r--r-- | fs/squashfs/squashfs.h | 2 | ||||
| -rw-r--r-- | fs/squashfs/super.c | 2 |
6 files changed, 20 insertions, 9 deletions
diff --git a/Documentation/filesystems/squashfs.txt b/Documentation/filesystems/squashfs.txt index 3e79e4a7a392..b324c033035a 100644 --- a/Documentation/filesystems/squashfs.txt +++ b/Documentation/filesystems/squashfs.txt | |||
| @@ -22,7 +22,7 @@ Squashfs filesystem features versus Cramfs: | |||
| 22 | 22 | ||
| 23 | Squashfs Cramfs | 23 | Squashfs Cramfs |
| 24 | 24 | ||
| 25 | Max filesystem size: 2^64 16 MiB | 25 | Max filesystem size: 2^64 256 MiB |
| 26 | Max file size: ~ 2 TiB 16 MiB | 26 | Max file size: ~ 2 TiB 16 MiB |
| 27 | Max files: unlimited unlimited | 27 | Max files: unlimited unlimited |
| 28 | Max directories: unlimited unlimited | 28 | Max directories: unlimited unlimited |
diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index c837dfc2b3c6..321728f48f2d 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c | |||
| @@ -80,7 +80,7 @@ static struct buffer_head *get_block_length(struct super_block *sb, | |||
| 80 | * generated a larger block - this does occasionally happen with zlib). | 80 | * generated a larger block - this does occasionally happen with zlib). |
| 81 | */ | 81 | */ |
| 82 | int squashfs_read_data(struct super_block *sb, void **buffer, u64 index, | 82 | int squashfs_read_data(struct super_block *sb, void **buffer, u64 index, |
| 83 | int length, u64 *next_index, int srclength) | 83 | int length, u64 *next_index, int srclength, int pages) |
| 84 | { | 84 | { |
| 85 | struct squashfs_sb_info *msblk = sb->s_fs_info; | 85 | struct squashfs_sb_info *msblk = sb->s_fs_info; |
| 86 | struct buffer_head **bh; | 86 | struct buffer_head **bh; |
| @@ -185,6 +185,14 @@ int squashfs_read_data(struct super_block *sb, void **buffer, u64 index, | |||
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | if (msblk->stream.avail_out == 0) { | 187 | if (msblk->stream.avail_out == 0) { |
| 188 | if (page == pages) { | ||
| 189 | ERROR("zlib_inflate tried to " | ||
| 190 | "decompress too much data, " | ||
| 191 | "expected %d bytes. Zlib " | ||
| 192 | "data probably corrupt\n", | ||
| 193 | srclength); | ||
| 194 | goto release_mutex; | ||
| 195 | } | ||
| 188 | msblk->stream.next_out = buffer[page++]; | 196 | msblk->stream.next_out = buffer[page++]; |
| 189 | msblk->stream.avail_out = PAGE_CACHE_SIZE; | 197 | msblk->stream.avail_out = PAGE_CACHE_SIZE; |
| 190 | } | 198 | } |
| @@ -268,7 +276,8 @@ block_release: | |||
| 268 | put_bh(bh[k]); | 276 | put_bh(bh[k]); |
| 269 | 277 | ||
| 270 | read_failure: | 278 | read_failure: |
| 271 | ERROR("sb_bread failed reading block 0x%llx\n", cur_index); | 279 | ERROR("squashfs_read_data failed to read block 0x%llx\n", |
| 280 | (unsigned long long) index); | ||
| 272 | kfree(bh); | 281 | kfree(bh); |
| 273 | return -EIO; | 282 | return -EIO; |
| 274 | } | 283 | } |
diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c index f29eda16d25e..1c4739e33af6 100644 --- a/fs/squashfs/cache.c +++ b/fs/squashfs/cache.c | |||
| @@ -119,7 +119,7 @@ struct squashfs_cache_entry *squashfs_cache_get(struct super_block *sb, | |||
| 119 | 119 | ||
| 120 | entry->length = squashfs_read_data(sb, entry->data, | 120 | entry->length = squashfs_read_data(sb, entry->data, |
| 121 | block, length, &entry->next_index, | 121 | block, length, &entry->next_index, |
| 122 | cache->block_size); | 122 | cache->block_size, cache->pages); |
| 123 | 123 | ||
| 124 | spin_lock(&cache->lock); | 124 | spin_lock(&cache->lock); |
| 125 | 125 | ||
| @@ -406,7 +406,7 @@ int squashfs_read_table(struct super_block *sb, void *buffer, u64 block, | |||
| 406 | for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE) | 406 | for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE) |
| 407 | data[i] = buffer; | 407 | data[i] = buffer; |
| 408 | res = squashfs_read_data(sb, data, block, length | | 408 | res = squashfs_read_data(sb, data, block, length | |
| 409 | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length); | 409 | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length, pages); |
| 410 | kfree(data); | 410 | kfree(data); |
| 411 | return res; | 411 | return res; |
| 412 | } | 412 | } |
diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c index 7a63398bb855..9101dbde39ec 100644 --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c | |||
| @@ -133,7 +133,8 @@ int squashfs_read_inode(struct inode *inode, long long ino) | |||
| 133 | type = le16_to_cpu(sqshb_ino->inode_type); | 133 | type = le16_to_cpu(sqshb_ino->inode_type); |
| 134 | switch (type) { | 134 | switch (type) { |
| 135 | case SQUASHFS_REG_TYPE: { | 135 | case SQUASHFS_REG_TYPE: { |
| 136 | unsigned int frag_offset, frag_size, frag; | 136 | unsigned int frag_offset, frag; |
| 137 | int frag_size; | ||
| 137 | u64 frag_blk; | 138 | u64 frag_blk; |
| 138 | struct squashfs_reg_inode *sqsh_ino = &squashfs_ino.reg; | 139 | struct squashfs_reg_inode *sqsh_ino = &squashfs_ino.reg; |
| 139 | 140 | ||
| @@ -175,7 +176,8 @@ int squashfs_read_inode(struct inode *inode, long long ino) | |||
| 175 | break; | 176 | break; |
| 176 | } | 177 | } |
| 177 | case SQUASHFS_LREG_TYPE: { | 178 | case SQUASHFS_LREG_TYPE: { |
| 178 | unsigned int frag_offset, frag_size, frag; | 179 | unsigned int frag_offset, frag; |
| 180 | int frag_size; | ||
| 179 | u64 frag_blk; | 181 | u64 frag_blk; |
| 180 | struct squashfs_lreg_inode *sqsh_ino = &squashfs_ino.lreg; | 182 | struct squashfs_lreg_inode *sqsh_ino = &squashfs_ino.lreg; |
| 181 | 183 | ||
diff --git a/fs/squashfs/squashfs.h b/fs/squashfs/squashfs.h index 6b2515d027d5..0e9feb6adf7e 100644 --- a/fs/squashfs/squashfs.h +++ b/fs/squashfs/squashfs.h | |||
| @@ -34,7 +34,7 @@ static inline struct squashfs_inode_info *squashfs_i(struct inode *inode) | |||
| 34 | 34 | ||
| 35 | /* block.c */ | 35 | /* block.c */ |
| 36 | extern int squashfs_read_data(struct super_block *, void **, u64, int, u64 *, | 36 | extern int squashfs_read_data(struct super_block *, void **, u64, int, u64 *, |
| 37 | int); | 37 | int, int); |
| 38 | 38 | ||
| 39 | /* cache.c */ | 39 | /* cache.c */ |
| 40 | extern struct squashfs_cache *squashfs_cache_init(char *, int, int); | 40 | extern struct squashfs_cache *squashfs_cache_init(char *, int, int); |
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 071df5b5b491..681ec0d83799 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c | |||
| @@ -389,7 +389,7 @@ static int __init init_squashfs_fs(void) | |||
| 389 | return err; | 389 | return err; |
| 390 | } | 390 | } |
| 391 | 391 | ||
| 392 | printk(KERN_INFO "squashfs: version 4.0 (2009/01/03) " | 392 | printk(KERN_INFO "squashfs: version 4.0 (2009/01/31) " |
| 393 | "Phillip Lougher\n"); | 393 | "Phillip Lougher\n"); |
| 394 | 394 | ||
| 395 | return 0; | 395 | return 0; |
