tcp: Remove unnecessary conditions in inet_csk_bind_conflict().
authorKuniyuki Iwashima <kuniyu@amazon.co.jp>
Tue, 10 Mar 2020 08:05:24 +0000 (17:05 +0900)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Mar 2020 19:08:09 +0000 (12:08 -0700)
When we get an ephemeral port, the relax is false, so the SO_REUSEADDR
conditions may be evaluated twice. We do not need to check the conditions
again.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/inet_connection_sock.c

index a4db79b1b64301c4d7d172f7c2673a30d4307196..2e9549f49a820de915c6228b0c97c0eb9c28d5cc 100644 (file)
@@ -146,17 +146,15 @@ static int inet_csk_bind_conflict(const struct sock *sk,
                    (!sk->sk_bound_dev_if ||
                     !sk2->sk_bound_dev_if ||
                     sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
-                       if ((!reuse || !sk2->sk_reuse ||
-                           sk2->sk_state == TCP_LISTEN) &&
-                           (!reuseport || !sk2->sk_reuseport ||
-                            rcu_access_pointer(sk->sk_reuseport_cb) ||
-                            (sk2->sk_state != TCP_TIME_WAIT &&
-                            !uid_eq(uid, sock_i_uid(sk2))))) {
-                               if (inet_rcv_saddr_equal(sk, sk2, true))
-                                       break;
-                       }
-                       if (!relax && reuse && sk2->sk_reuse &&
+                       if (reuse && sk2->sk_reuse &&
                            sk2->sk_state != TCP_LISTEN) {
+                               if (!relax &&
+                                   inet_rcv_saddr_equal(sk, sk2, true))
+                                       break;
+                       } else if (!reuseport || !sk2->sk_reuseport ||
+                                  rcu_access_pointer(sk->sk_reuseport_cb) ||
+                                  (sk2->sk_state != TCP_TIME_WAIT &&
+                                   !uid_eq(uid, sock_i_uid(sk2)))) {
                                if (inet_rcv_saddr_equal(sk, sk2, true))
                                        break;
                        }