• Tycho Andersen's avatar
    seccomp: don't leak memory when filter install races · a566a901
    Tycho Andersen authored
    In seccomp_set_mode_filter() with TSYNC | NEW_LISTENER, we first initialize
    the listener fd, then check to see if we can actually use it later in
    seccomp_may_assign_mode(), which can fail if anyone else in our thread
    group has installed a filter and caused some divergence. If we can't, we
    partially clean up the newly allocated file: we put the fd, put the file,
    but don't actually clean up the *memory* that was allocated at
    filter->notif. Let's clean that up too.
    
    To accomplish this, let's hoist the actual "detach a notifier from a
    filter" code to its own helper out of seccomp_notify_release(), so that in
    case anyone adds stuff to init_listener(), they only have to add the
    cleanup code in one spot. This does a bit of extra locking and such on the
    failure path when the filter is not attached, but it's a slow failure path
    anyway.
    
    Fixes: 51891498 ("seccomp: allow TSYNC and USER_NOTIF together")
    Reported-by: syzbot+3ad9614a12f80994c32e@syzkaller.appspotmail.com
    Signed-off-by: default avatarTycho Andersen <tycho@tycho.pizza>
    Acked-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
    Link: https://lore.kernel.org/r/20200902014017.934315-1-tycho@tycho.pizzaSigned-off-by: default avatarKees Cook <keescook@chromium.org>
    a566a901
seccomp.c 53.3 KB