On Wed, Jan 22, 2020 at 02:05:41PM +0100, Jakub Sitnicki wrote: > Prepare for cloning listening sockets that have their protocol callbacks > overridden by sk_msg. Child sockets must not inherit parent callbacks that > access state stored in sk_user_data owned by the parent. > > Restore the child socket protocol callbacks before it gets hashed and any > of the callbacks can get invoked. > > Signed-off-by: Jakub Sitnicki <jakub@xxxxxxxxxxxxxx> > --- > include/net/tcp.h | 7 +++++++ > net/ipv4/tcp_bpf.c | 13 +++++++++++++ > net/ipv4/tcp_minisocks.c | 2 ++ > 3 files changed, 22 insertions(+) > > diff --git a/include/net/tcp.h b/include/net/tcp.h > index 9dd975be7fdf..ac205d31e4ad 100644 > --- a/include/net/tcp.h > +++ b/include/net/tcp.h > @@ -2181,6 +2181,13 @@ int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, > int nonblock, int flags, int *addr_len); > int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock, > struct msghdr *msg, int len, int flags); > +#ifdef CONFIG_NET_SOCK_MSG > +void tcp_bpf_clone(const struct sock *sk, struct sock *child); nit. "struct sock *child" vs ... > +#else > +static inline void tcp_bpf_clone(const struct sock *sk, struct sock *child) > +{ > +} > +#endif > > /* Call BPF_SOCK_OPS program that returns an int. If the return value > * is < 0, then the BPF op failed (for example if the loaded BPF > diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c > index 4f25aba44ead..16060e0893a1 100644 > --- a/net/ipv4/tcp_bpf.c > +++ b/net/ipv4/tcp_bpf.c > @@ -582,6 +582,19 @@ static void tcp_bpf_close(struct sock *sk, long timeout) > saved_close(sk, timeout); > } > > +/* If a child got cloned from a listening socket that had tcp_bpf > + * protocol callbacks installed, we need to restore the callbacks to > + * the default ones because the child does not inherit the psock state > + * that tcp_bpf callbacks expect. > + */ > +void tcp_bpf_clone(const struct sock *sk, struct sock *newsk) "struct sock *newsk" here. Could be a follow-up. Other than that, Acked-by: Martin KaFai Lau <kafai@xxxxxx> > +{ > + struct proto *prot = newsk->sk_prot; > + > + if (prot->unhash == tcp_bpf_unhash) > + newsk->sk_prot = sk->sk_prot_creator; > +} > +