net/compat: Add missing sock updates for SCM_RIGHTS
[ Upstream commit d9539752d23283db4692384a634034f451261e29 ] 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:48a87cc26c
("net: netprio: fd passed in SCM_RIGHTS datagram not set correctly") Fixes:d84295067f
("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: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
c5f1fa154b
commit
34c2166235
3 changed files with 26 additions and 0 deletions
|
@ -779,6 +779,8 @@ static inline int sk_memalloc_socks(void)
|
||||||
{
|
{
|
||||||
return static_key_false(&memalloc_socks);
|
return static_key_false(&memalloc_socks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __receive_sock(struct file *file);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline int sk_memalloc_socks(void)
|
static inline int sk_memalloc_socks(void)
|
||||||
|
@ -786,6 +788,8 @@ static inline int sk_memalloc_socks(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void __receive_sock(struct file *file)
|
||||||
|
{ }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline gfp_t sk_gfp_atomic(const struct sock *sk, gfp_t gfp_mask)
|
static inline gfp_t sk_gfp_atomic(const struct sock *sk, gfp_t gfp_mask)
|
||||||
|
|
|
@ -284,6 +284,7 @@ void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Bump the usage count and install the file. */
|
/* Bump the usage count and install the file. */
|
||||||
|
__receive_sock(fp[i]);
|
||||||
fd_install(new_fd, get_file(fp[i]));
|
fd_install(new_fd, get_file(fp[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2275,6 +2275,27 @@ int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sock_no_mmap);
|
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);
|
||||||
|
sock_update_classid(sock->sk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
|
ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
|
||||||
{
|
{
|
||||||
ssize_t res;
|
ssize_t res;
|
||||||
|
|
Loading…
Add table
Reference in a new issue