diff options
Diffstat (limited to 'fs/hfsplus/super.c')
| -rw-r--r-- | fs/hfsplus/super.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index c106ca22e81..d24a9b666a2 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)  	struct inode *root, *inode;  	struct qstr str;  	struct nls_table *nls = NULL; +	u64 last_fs_block, last_fs_page;  	int err;  	err = -EINVAL; @@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)  	if (!sbi->rsrc_clump_blocks)  		sbi->rsrc_clump_blocks = 1; -	err = generic_check_addressable(sbi->alloc_blksz_shift, -					sbi->total_blocks); -	if (err) { +	err = -EFBIG; +	last_fs_block = sbi->total_blocks - 1; +	last_fs_page = (last_fs_block << sbi->alloc_blksz_shift) >> +			PAGE_CACHE_SHIFT; + +	if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) || +	    (last_fs_page > (pgoff_t)(~0ULL))) {  		printk(KERN_ERR "hfs: filesystem size too large.\n");  		goto out_free_vhdr;  	} @@ -525,8 +530,8 @@ out_close_cat_tree:  out_close_ext_tree:  	hfs_btree_close(sbi->ext_tree);  out_free_vhdr: -	kfree(sbi->s_vhdr); -	kfree(sbi->s_backup_vhdr); +	kfree(sbi->s_vhdr_buf); +	kfree(sbi->s_backup_vhdr_buf);  out_unload_nls:  	unload_nls(sbi->nls);  	unload_nls(nls);  |