Skip to content
  • Christian Brauner's avatar
    6abc20f8
    selftests/core: add regression test for CLOSE_RANGE_UNSHARE | CLOSE_RANGE_CLOEXEC · 6abc20f8
    Christian Brauner authored
    This test is a minimalized version of the reproducer given by syzbot
    (cf. [1]).
    
    After introducing CLOSE_RANGE_CLOEXEC syzbot reported a crash when
    CLOSE_RANGE_CLOEXEC is specified in conjunction with
    CLOSE_RANGE_UNSHARE. When CLOSE_RANGE_UNSHARE is specified the caller
    will receive a private file descriptor table in case their file
    descriptor table is currently shared.
    For the case where the caller has requested all file descriptors to be
    actually closed via e.g. close_range(3, ~0U, 0) the kernel knows that
    the caller does not need any of the file descriptors anymore and will
    optimize the close operation by only copying all files in the range from
    0 to 3 and no others.
    
    However, if the caller requested CLOSE_RANGE_CLOEXEC together with
    CLOSE_RANGE_UNSHARE the caller wants to still make use of the file
    descriptors so the kernel needs to copy all of them and can't optimize.
    
    The original patch didn't account for this and thus could cause oopses
    as evidenced by the syzbot report. Add tests for this regression.
    
    We first create a huge gap in the fd table. When we now call
    CLOSE_RANGE_UNSHARE with a shared fd table and and with ~0U as upper
    bound the kernel will only copy up to fd1 file descriptors into the new
    fd table. If the kernel is buggy and doesn't handle CLOSE_RANGE_CLOEXEC
    correctly it will not have copied all file descriptors and we will oops!
    
    This test passes on a fixed kernel and will trigger an oops on a buggy
    kernel.
    
    [1]: https://syzkaller.appspot.com/text?tag=KernelConfig&x=db720fe37a6a41d8
    
    Cc: Giuseppe Scrivano <gscrivan@redhat.com>
    Cc: linux-fsdevel@vger.kernel.org
    Link: syzbot+96cfd2b22b3213646a93@syzkaller.appspotmail.com
    Link: https://lore.kernel.org/r/20201218145415.801063-4-christian.brauner@ubuntu.com
    
    
    Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
    6abc20f8
    selftests/core: add regression test for CLOSE_RANGE_UNSHARE | CLOSE_RANGE_CLOEXEC
    Christian Brauner authored
    This test is a minimalized version of the reproducer given by syzbot
    (cf. [1]).
    
    After introducing CLOSE_RANGE_CLOEXEC syzbot reported a crash when
    CLOSE_RANGE_CLOEXEC is specified in conjunction with
    CLOSE_RANGE_UNSHARE. When CLOSE_RANGE_UNSHARE is specified the caller
    will receive a private file descriptor table in case their file
    descriptor table is currently shared.
    For the case where the caller has requested all file descriptors to be
    actually closed via e.g. close_range(3, ~0U, 0) the kernel knows that
    the caller does not need any of the file descriptors anymore and will
    optimize the close operation by only copying all files in the range from
    0 to 3 and no others.
    
    However, if the caller requested CLOSE_RANGE_CLOEXEC together with
    CLOSE_RANGE_UNSHARE the caller wants to still make use of the file
    descriptors so the kernel needs to copy all of them and can't optimize.
    
    The original patch didn't account for this and thus could cause oopses
    as evidenced by the syzbot report. Add tests for this regression.
    
    We first create a huge gap in the fd table. When we now call
    CLOSE_RANGE_UNSHARE with a shared fd table and and with ~0U as upper
    bound the kernel will only copy up to fd1 file descriptors into the new
    fd table. If the kernel is buggy and doesn't handle CLOSE_RANGE_CLOEXEC
    correctly it will not have copied all file descriptors and we will oops!
    
    This test passes on a fixed kernel and will trigger an oops on a buggy
    kernel.
    
    [1]: https://syzkaller.appspot.com/text?tag=KernelConfig&x=db720fe37a6a41d8
    
    Cc: Giuseppe Scrivano <gscrivan@redhat.com>
    Cc: linux-fsdevel@vger.kernel.org
    Link: syzbot+96cfd2b22b3213646a93@syzkaller.appspotmail.com
    Link: https://lore.kernel.org/r/20201218145415.801063-4-christian.brauner@ubuntu.com
    
    
    Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
Loading