tcp: ipv4: Pass lockdep expression to RCU lists
authorAmol Grover <frextrite@gmail.com>
Fri, 21 Feb 2020 17:57:14 +0000 (23:27 +0530)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Feb 2020 21:07:03 +0000 (13:07 -0800)
md5sig->head maybe traversed using hlist_for_each_entry_rcu
outside an RCU read-side critical section but under the protection
of socket lock.

Hence, add corresponding lockdep expression to silence false-positive
warnings, and harden RCU lists.

Signed-off-by: Amol Grover <frextrite@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_ipv4.c

index df1166b..52acf0b 100644 (file)
@@ -1019,7 +1019,8 @@ struct tcp_md5sig_key *__tcp_md5_do_lookup(const struct sock *sk, int l3index,
        if (!md5sig)
                return NULL;
 
-       hlist_for_each_entry_rcu(key, &md5sig->head, node) {
+       hlist_for_each_entry_rcu(key, &md5sig->head, node,
+                                lockdep_sock_is_held(sk)) {
                if (key->family != family)
                        continue;
                if (key->l3index && key->l3index != l3index)
@@ -1064,7 +1065,8 @@ static struct tcp_md5sig_key *tcp_md5_do_lookup_exact(const struct sock *sk,
        if (family == AF_INET6)
                size = sizeof(struct in6_addr);
 #endif
-       hlist_for_each_entry_rcu(key, &md5sig->head, node) {
+       hlist_for_each_entry_rcu(key, &md5sig->head, node,
+                                lockdep_sock_is_held(sk)) {
                if (key->family != family)
                        continue;
                if (key->l3index && key->l3index != l3index)