]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
tcp/dccp: fix lockdep splat in inet_csk_route_req()
authorEric Dumazet <edumazet@google.com>
Sun, 22 Oct 2017 19:33:57 +0000 (12:33 -0700)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 14 Mar 2018 10:40:07 +0000 (11:40 +0100)
BugLink: http://bugs.launchpad.net/bugs/1744121
[ Upstream commit a6ca7abe53633d08eea1c6756cb49c9b2d4c90bf ]

This patch fixes the following lockdep splat in inet_csk_route_req()

  lockdep_rcu_suspicious
  inet_csk_route_req
  tcp_v4_send_synack
  tcp_rtx_synack
  inet_rtx_syn_ack
  tcp_fastopen_synack_time
  tcp_retransmit_timer
  tcp_write_timer_handler
  tcp_write_timer
  call_timer_fn

Thread running inet_csk_route_req() owns a reference on the request
socket, so we have the guarantee ireq->ireq_opt wont be changed or
freed.

lockdep can enforce this invariant for us.

Fixes: c92e8c02fe66 ("tcp/dccp: fix ireq->opt races")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
net/ipv4/inet_connection_sock.c

index ffd566e6b5e0892b7f51336ca2e95cf7edb63aa4..d52c0d357a46ae27ae8d2a9f37f7f56e5701a720 100644 (file)
@@ -542,7 +542,8 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk,
        struct ip_options_rcu *opt;
        struct rtable *rt;
 
-       opt = rcu_dereference(ireq->ireq_opt);
+       opt = rcu_dereference_protected(ireq->ireq_opt,
+                                       refcount_read(&req->rsk_refcnt) > 0);
        flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark,
                           RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
                           sk->sk_protocol, inet_sk_flowi_flags(sk),