lkml.org 
[lkml]   [2018]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 014/118] hfsplus: prevent btree data loss on root split
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit 0a3021d4f5295aa073c7bf5c5e4de60a2e292578 ]

    Creating, renaming or deleting a file may cause catalog corruption and
    data loss. This bug is randomly triggered by xfstests generic/027, but
    here is a faster reproducer:

    truncate -s 50M fs.iso
    mkfs.hfsplus fs.iso
    mount fs.iso /mnt
    i=100
    while [ $i -le 150 ]; do
    touch /mnt/$i &>/dev/null
    ((++i))
    done
    i=100
    while [ $i -le 150 ]; do
    mv /mnt/$i /mnt/$(perl -e "print $i x82") &>/dev/null
    ((++i))
    done
    umount /mnt
    fsck.hfsplus -n fs.iso

    The 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.

    Link: http://lkml.kernel.org/r/26d882184fc43043a810114258f45277752186c7.1535682461.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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/hfsplus/brec.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/fs/hfsplus/brec.c b/fs/hfsplus/brec.c
    index ed8eacb34452..aa17a392b414 100644
    --- a/fs/hfsplus/brec.c
    +++ b/fs/hfsplus/brec.c
    @@ -429,6 +429,10 @@ skip:
    if (new_node) {
    __be32 cnid;

    + if (!new_node->parent) {
    + hfs_btree_inc_height(tree);
    + new_node->parent = tree->root;
    + }
    fd->bnode = hfs_bnode_find(tree, new_node->parent);
    /* create index key and entry */
    hfs_bnode_read_key(new_node, fd->search_key, 14);
    --
    2.17.1


    \
     
     \ /
      Last update: 2018-11-26 12:13    [W:5.145 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site