]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.4.165/hfs-prevent-btree-data-loss-on-root-split.patch
Fixes for 4.19
[thirdparty/kernel/stable-queue.git] / releases / 4.4.165 / hfs-prevent-btree-data-loss-on-root-split.patch
1 From 621af425a7e8a9c900edeacbe112c3d4d6ea2de3 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Ernesto=20A=2E=20Fern=C3=A1ndez?=
3 <ernesto.mnd.fernandez@gmail.com>
4 Date: Tue, 30 Oct 2018 15:06:07 -0700
5 Subject: hfs: prevent btree data loss on root split
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 [ Upstream commit d057c036672f33d43a5f7344acbb08cf3a8a0c09 ]
11
12 This bug is triggered whenever hfs_brec_update_parent() needs to split
13 the root node. The height of the btree is not increased, which leaves
14 the new node orphaned and its records lost. It is not possible for this
15 to happen on a valid hfs filesystem because the index nodes have fixed
16 length keys.
17
18 For reasons I ignore, the hfs module does have support for a number of
19 hfsplus features. A corrupt btree header may report variable length
20 keys and trigger this bug, so it's better to fix it.
21
22 Link: http://lkml.kernel.org/r/9750b1415685c4adca10766895f6d5ef12babdb0.1535682463.git.ernesto.mnd.fernandez@gmail.com
23 Signed-off-by: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com>
24 Cc: Christoph Hellwig <hch@infradead.org>
25 Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
26 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
27 Signed-off-by: Sasha Levin <sashal@kernel.org>
28 ---
29 fs/hfs/brec.c | 4 ++++
30 1 file changed, 4 insertions(+)
31
32 diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c
33 index 2a6f3c67cb3f..2e713673df42 100644
34 --- a/fs/hfs/brec.c
35 +++ b/fs/hfs/brec.c
36 @@ -424,6 +424,10 @@ skip:
37 if (new_node) {
38 __be32 cnid;
39
40 + if (!new_node->parent) {
41 + hfs_btree_inc_height(tree);
42 + new_node->parent = tree->root;
43 + }
44 fd->bnode = hfs_bnode_find(tree, new_node->parent);
45 /* create index key and entry */
46 hfs_bnode_read_key(new_node, fd->search_key, 14);
47 --
48 2.17.1
49