mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-07-01 23:53:16 -04:00
af_unix: Avoid socket->sk NULL OOPS in stream connect security hooks.
unix_release() can asynchornously set socket->sk to NULL, and it does so without holding the unix_state_lock() on "other" during stream connects. However, the reverse mapping, sk->sk_socket, is only transitioned to NULL under the unix_state_lock(). Therefore make the security hooks follow the reverse mapping instead of the forward mapping. Reported-by: Jeremy Fitzhardinge <jeremy@goop.org> Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
44b8288308
commit
3610cda53f
6 changed files with 22 additions and 24 deletions
|
@ -796,8 +796,9 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
|
|||
* @unix_stream_connect:
|
||||
* Check permissions before establishing a Unix domain stream connection
|
||||
* between @sock and @other.
|
||||
* @sock contains the socket structure.
|
||||
* @other contains the peer socket structure.
|
||||
* @sock contains the sock structure.
|
||||
* @other contains the peer sock structure.
|
||||
* @newsk contains the new sock structure.
|
||||
* Return 0 if permission is granted.
|
||||
* @unix_may_send:
|
||||
* Check permissions before connecting or sending datagrams from @sock to
|
||||
|
@ -1568,8 +1569,7 @@ struct security_operations {
|
|||
int (*inode_getsecctx)(struct inode *inode, void **ctx, u32 *ctxlen);
|
||||
|
||||
#ifdef CONFIG_SECURITY_NETWORK
|
||||
int (*unix_stream_connect) (struct socket *sock,
|
||||
struct socket *other, struct sock *newsk);
|
||||
int (*unix_stream_connect) (struct sock *sock, struct sock *other, struct sock *newsk);
|
||||
int (*unix_may_send) (struct socket *sock, struct socket *other);
|
||||
|
||||
int (*socket_create) (int family, int type, int protocol, int kern);
|
||||
|
@ -2525,8 +2525,7 @@ static inline int security_inode_getsecctx(struct inode *inode, void **ctx, u32
|
|||
|
||||
#ifdef CONFIG_SECURITY_NETWORK
|
||||
|
||||
int security_unix_stream_connect(struct socket *sock, struct socket *other,
|
||||
struct sock *newsk);
|
||||
int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk);
|
||||
int security_unix_may_send(struct socket *sock, struct socket *other);
|
||||
int security_socket_create(int family, int type, int protocol, int kern);
|
||||
int security_socket_post_create(struct socket *sock, int family,
|
||||
|
@ -2567,8 +2566,8 @@ void security_tun_dev_post_create(struct sock *sk);
|
|||
int security_tun_dev_attach(struct sock *sk);
|
||||
|
||||
#else /* CONFIG_SECURITY_NETWORK */
|
||||
static inline int security_unix_stream_connect(struct socket *sock,
|
||||
struct socket *other,
|
||||
static inline int security_unix_stream_connect(struct sock *sock,
|
||||
struct sock *other,
|
||||
struct sock *newsk)
|
||||
{
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue