From: Jeff Mahoney <jeffm@xxxxxxxx> A particular fsfuzzer run caused an hfs file system to crash on mount. This is due to a corrupted MDB extent record causing a miscalculation of HFSPLUS_I(inode)->first_blocks for the extent tree. If the extent records are zereod out, then it won't trigger the first_blocks special case and instead falls through to the extent code, which we're in the middle of initializing. This patch catches the 0 size extent records, reports the corruption, and fails the mount. [hch: ported of commit 47f365eb575735c6b2edf5d08e0d16d26a9c23bd from hfs] Reported-by: Ramon de Carvalho Valle <rcvalle@xxxxxxxxxxxxxxxxxx> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx> Signed-off-by: Christoph Hellwig <hch@xxxxxxxxxx> Index: linux-2.6/fs/hfsplus/btree.c =================================================================== --- linux-2.6.orig/fs/hfsplus/btree.c 2010-10-01 16:52:32.362010219 +0200 +++ linux-2.6/fs/hfsplus/btree.c 2010-10-01 16:53:49.328291422 +0200 @@ -39,10 +39,16 @@ struct hfs_btree *hfs_btree_open(struct goto free_tree; tree->inode = inode; + if (!HFSPLUS_I(tree->inode)->first_blocks) { + printk(KERN_ERR + "hfs: invalid btree extent records (0 size).\n"); + goto free_inode; + } + mapping = tree->inode->i_mapping; page = read_mapping_page(mapping, 0, NULL); if (IS_ERR(page)) - goto free_tree; + goto free_inode; /* Load the header */ head = (struct hfs_btree_header_rec *)(kmap(page) + sizeof(struct hfs_bnode_desc)); @@ -89,8 +95,9 @@ struct hfs_btree *hfs_btree_open(struct fail_page: tree->inode->i_mapping->a_ops = &hfsplus_aops; page_cache_release(page); - free_tree: + free_inode: iput(tree->inode); + free_tree: kfree(tree); return NULL; } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html