Message ID | 20180816194910.9040-3-daniel@iogearbox.net |
---|---|
State | Accepted, archived |
Delegated to: | BPF Maintainers |
Headers | show |
Series | BPF sockmap and ulp fixes | expand |
On Thu, Aug 16, 2018 at 12:49 PM, Daniel Borkmann <daniel@iogearbox.net> wrote: > I found that in BPF sockmap programs once we either delete a socket > from the map or we updated a map slot and the old socket was purged > from the map that these socket can never get reattached into a map > even though their related psock has been dropped entirely at that > point. > > Reason is that tcp_cleanup_ulp() leaves the old icsk->icsk_ulp_ops > intact, so that on the next tcp_set_ulp_id() the kernel returns an > -EEXIST thinking there is still some active ULP attached. > > BPF sockmap is the only one that has this issue as the other user, > kTLS, only calls tcp_cleanup_ulp() from tcp_v4_destroy_sock() whereas > sockmap semantics allow dropping the socket from the map with all > related psock state being cleaned up. > > Fixes: 1aa12bdf1bfb ("bpf: sockmap, add sock close() hook to remove socks") > Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> > Acked-by: John Fastabend <john.fastabend@gmail.com> Acked-by: Song Liu <songliubraving@fb.com> > --- > net/ipv4/tcp_ulp.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/net/ipv4/tcp_ulp.c b/net/ipv4/tcp_ulp.c > index 7dd44b6..a5995bb 100644 > --- a/net/ipv4/tcp_ulp.c > +++ b/net/ipv4/tcp_ulp.c > @@ -129,6 +129,8 @@ void tcp_cleanup_ulp(struct sock *sk) > if (icsk->icsk_ulp_ops->release) > icsk->icsk_ulp_ops->release(sk); > module_put(icsk->icsk_ulp_ops->owner); > + > + icsk->icsk_ulp_ops = NULL; > } > > /* Change upper layer protocol for socket */ > -- > 2.9.5 >
diff --git a/net/ipv4/tcp_ulp.c b/net/ipv4/tcp_ulp.c index 7dd44b6..a5995bb 100644 --- a/net/ipv4/tcp_ulp.c +++ b/net/ipv4/tcp_ulp.c @@ -129,6 +129,8 @@ void tcp_cleanup_ulp(struct sock *sk) if (icsk->icsk_ulp_ops->release) icsk->icsk_ulp_ops->release(sk); module_put(icsk->icsk_ulp_ops->owner); + + icsk->icsk_ulp_ops = NULL; } /* Change upper layer protocol for socket */