Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hfs: prevent btree data loss on root split

This bug is triggered whenever hfs_brec_update_parent() needs to split
the root node. The height of the btree is not increased, which leaves
the new node orphaned and its records lost. It is not possible for this
to happen on a valid hfs filesystem because the index nodes have fixed
length keys.

For reasons I ignore, the hfs module does have support for a number of
hfsplus features. A corrupt btree header may report variable length
keys and trigger this bug, so it's better to fix it.

Link: http://lkml.kernel.org/r/9750b1415685c4adca10766895f6d5ef12babdb0.1535682463.git.ernesto.mnd.fernandez@gmail.com
Signed-off-by: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com>
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Ernesto A. Fernández and committed by
Linus Torvalds
d057c036 19a9d0f1

+4
+4
fs/hfs/brec.c
··· 425 425 if (new_node) { 426 426 __be32 cnid; 427 427 428 + if (!new_node->parent) { 429 + hfs_btree_inc_height(tree); 430 + new_node->parent = tree->root; 431 + } 428 432 fd->bnode = hfs_bnode_find(tree, new_node->parent); 429 433 /* create index key and entry */ 430 434 hfs_bnode_read_key(new_node, fd->search_key, 14);