• yangerkun's avatar
    locks: fix a potential use-after-free problem when wakeup a waiter · 6d390e4b
    yangerkun authored
    '16306a61 ("fs/locks: always delete_block after waiting.")' add the
    logic to check waiter->fl_blocker without blocked_lock_lock. And it will
    trigger a UAF when we try to wakeup some waiter:
    
    Thread 1 has create a write flock a on file, and now thread 2 try to
    unlock and delete flock a, thread 3 try to add flock b on the same file.
    
    Thread2                         Thread3
                                    flock syscall(create flock b)
    	                        ...flock_lock_inode_wait
    				    flock_lock_inode(will insert
    				    our fl_blocked_member list
    				    to flock a's fl_blocked_requests)
    				   sleep
    flock syscall(unlock)
    ...flock_lock_inode_wait
        locks_delete_lock_ctx
        ...__locks_wake_up_blocks
            __locks_delete_blocks(
    	b->fl_blocker = NULL)
    	...
                                       break by a signal
    				   locks_delete_block
    				    b->fl_blocker == NULL &&
    				    list_empty(&b->fl_blocked_requests)
    	                            success, return directly
    				 locks_free_lock b
    	wake_up(&b->fl_waiter)
    	trigger UAF
    
    Fix it by remove this logic, and this patch may also fix CVE-2019-19769.
    
    Cc: stable@vger.kernel.org
    Fixes: 16306a61 ("fs/locks: always delete_block after waiting.")
    Signed-off-by: default avataryangerkun <yangerkun@huawei.com>
    Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
    6d390e4b
locks.c 78.2 KB