Patch "f2fs: fix to avoid NULL pointer dereference" has been added to the 5.12-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    f2fs: fix to avoid NULL pointer dereference

to the 5.12-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     f2fs-fix-to-avoid-null-pointer-dereference.patch
and it can be found in the queue-5.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 334728a3a50e6b4f24f7eb28dd6f0fbe26d4412d
Author: Yi Chen <chenyi77@xxxxxxxxxx>
Date:   Tue Apr 13 17:30:50 2021 +0800

    f2fs: fix to avoid NULL pointer dereference
    
    [ Upstream commit 594b6d0428ae304e0b44457398beb458b938f005 ]
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
    pc : f2fs_put_page+0x1c/0x26c
    lr : __revoke_inmem_pages+0x544/0x75c
    f2fs_put_page+0x1c/0x26c
    __revoke_inmem_pages+0x544/0x75c
    __f2fs_commit_inmem_pages+0x364/0x3c0
    f2fs_commit_inmem_pages+0xc8/0x1a0
    f2fs_ioc_commit_atomic_write+0xa4/0x15c
    f2fs_ioctl+0x5b0/0x1574
    file_ioctl+0x154/0x320
    do_vfs_ioctl+0x164/0x740
    __arm64_sys_ioctl+0x78/0xa4
    el0_svc_common+0xbc/0x1d0
    el0_svc_handler+0x74/0x98
    el0_svc+0x8/0xc
    
    In f2fs_put_page, we access page->mapping is NULL.
    The root cause is:
    In some cases, the page refcount and ATOMIC_WRITTEN_PAGE
    flag miss set for page-priavte flag has been set.
    We add f2fs_bug_on like this:
    
    f2fs_register_inmem_page()
    {
            ...
            f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
    
            f2fs_bug_on(F2FS_I_SB(inode), !IS_ATOMIC_WRITTEN_PAGE(page));
            ...
    }
    
    The bug on stack follow link this:
    PC is at f2fs_register_inmem_page+0x238/0x2b4
    LR is at f2fs_register_inmem_page+0x2a8/0x2b4
    f2fs_register_inmem_page+0x238/0x2b4
    f2fs_set_data_page_dirty+0x104/0x164
    set_page_dirty+0x78/0xc8
    f2fs_write_end+0x1b4/0x444
    generic_perform_write+0x144/0x1cc
    __generic_file_write_iter+0xc4/0x174
    f2fs_file_write_iter+0x2c0/0x350
    __vfs_write+0x104/0x134
    vfs_write+0xe8/0x19c
    SyS_pwrite64+0x78/0xb8
    
    To fix this issue, let's add page refcount add page-priavte flag.
    The page-private flag is not cleared and needs further analysis.
    
    Signed-off-by: Chao Yu <yuchao0@xxxxxxxxxx>
    Signed-off-by: Ge Qiu <qiuge@xxxxxxxxxx>
    Signed-off-by: Dehe Gu <gudehe@xxxxxxxxxx>
    Signed-off-by: Yi Chen <chenyi77@xxxxxxxxxx>
    Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 77456d228f2a..bb6d86255741 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -186,7 +186,10 @@ void f2fs_register_inmem_page(struct inode *inode, struct page *page)
 {
 	struct inmem_pages *new;
 
-	f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
+	if (PagePrivate(page))
+		set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
+	else
+		f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
 
 	new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux