lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 062/232] net/compat: Add missing sock updates for SCM_RIGHTS
    Date
    From: Kees Cook <keescook@chromium.org>

    commit d9539752d23283db4692384a634034f451261e29 upstream.

    Add missed sock updates to compat path via a new helper, which will be
    used more in coming patches. (The net/core/scm.c code is left as-is here
    to assist with -stable backports for the compat path.)

    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Sargun Dhillon <sargun@sargun.me>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: stable@vger.kernel.org
    Fixes: 48a87cc26c13 ("net: netprio: fd passed in SCM_RIGHTS datagram not set correctly")
    Fixes: d84295067fc7 ("net: net_cls: fd passed in SCM_RIGHTS datagram not set correctly")
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    include/net/sock.h | 4 ++++
    net/compat.c | 1 +
    net/core/sock.c | 21 +++++++++++++++++++++
    3 files changed, 26 insertions(+)

    --- a/include/net/sock.h
    +++ b/include/net/sock.h
    @@ -891,6 +891,8 @@ static inline int sk_memalloc_socks(void
    {
    return static_branch_unlikely(&memalloc_socks_key);
    }
    +
    +void __receive_sock(struct file *file);
    #else

    static inline int sk_memalloc_socks(void)
    @@ -898,6 +900,8 @@ static inline int sk_memalloc_socks(void
    return 0;
    }

    +static inline void __receive_sock(struct file *file)
    +{ }
    #endif

    static inline gfp_t sk_gfp_mask(const struct sock *sk, gfp_t gfp_mask)
    --- a/net/compat.c
    +++ b/net/compat.c
    @@ -309,6 +309,7 @@ void scm_detach_fds_compat(struct msghdr
    break;
    }
    /* Bump the usage count and install the file. */
    + __receive_sock(fp[i]);
    fd_install(new_fd, get_file(fp[i]));
    }

    --- a/net/core/sock.c
    +++ b/net/core/sock.c
    @@ -2842,6 +2842,27 @@ int sock_no_mmap(struct file *file, stru
    }
    EXPORT_SYMBOL(sock_no_mmap);

    +/*
    + * When a file is received (via SCM_RIGHTS, etc), we must bump the
    + * various sock-based usage counts.
    + */
    +void __receive_sock(struct file *file)
    +{
    + struct socket *sock;
    + int error;
    +
    + /*
    + * The resulting value of "error" is ignored here since we only
    + * need to take action when the file is a socket and testing
    + * "sock" for NULL is sufficient.
    + */
    + sock = sock_from_file(file, &error);
    + if (sock) {
    + sock_update_netprioidx(&sock->sk->sk_cgrp_data);
    + sock_update_classid(&sock->sk->sk_cgrp_data);
    + }
    +}
    +
    ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
    {
    ssize_t res;

    \
     
     \ /
      Last update: 2020-08-20 15:50    [W:2.271 / U:0.616 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site