lkml.org 
[lkml]   [2023]   [Oct]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.5 13/52] fs/ntfs3: Fix possible null-pointer dereference in hdr_find_e()
    Date
    From: Ziqi Zhao <astrajoan@yahoo.com>

    [ Upstream commit 1f9b94af923c88539426ed811ae7e9543834a5c5 ]

    Upon investigation of the C reproducer provided by Syzbot, it seemed
    the reproducer was trying to mount a corrupted NTFS filesystem, then
    issue a rename syscall to some nodes in the filesystem. This can be
    shown by modifying the reproducer to only include the mount syscall,
    and investigating the filesystem by e.g. `ls` and `rm` commands. As a
    result, during the problematic call to `hdr_fine_e`, the `inode` being
    supplied did not go through `indx_init`, hence the `cmp` function
    pointer was never set.

    The fix is simply to check whether `cmp` is not set, and return NULL
    if that's the case, in order to be consistent with other error
    scenarios of the `hdr_find_e` method. The rationale behind this patch
    is that:

    - We should prevent crashing the kernel even if the mounted filesystem
    is corrupted. Any syscalls made on the filesystem could return
    invalid, but the kernel should be able to sustain these calls.

    - Only very specific corruption would lead to this bug, so it would be
    a pretty rare case in actual usage anyways. Therefore, introducing a
    check to specifically protect against this bug seems appropriate.
    Because of its rarity, an `unlikely` clause is used to wrap around
    this nullity check.

    Reported-by: syzbot+60cf892fc31d1f4358fc@syzkaller.appspotmail.com
    Signed-off-by: Ziqi Zhao <astrajoan@yahoo.com>
    Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/ntfs3/index.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c
    index 124c6e822623f..cf92b2433f7a7 100644
    --- a/fs/ntfs3/index.c
    +++ b/fs/ntfs3/index.c
    @@ -729,6 +729,9 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
    u32 total = le32_to_cpu(hdr->total);
    u16 offs[128];

    + if (unlikely(!cmp))
    + return NULL;
    +
    fill_table:
    if (end > total)
    return NULL;
    --
    2.42.0
    \
     
     \ /
      Last update: 2023-10-29 23:56    [W:6.747 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site