]> git.dujemihanovic.xyz Git - linux.git/commitdiff
inet: fix fast path in __inet_hash_connect()
authorPietro Borrello <borrello@diag.uniroma1.it>
Sat, 14 Jan 2023 13:11:41 +0000 (13:11 +0000)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 17 Jan 2023 11:02:31 +0000 (12:02 +0100)
__inet_hash_connect() has a fast path taken if sk_head(&tb->owners) is
equal to the sk parameter.
sk_head() returns the hlist_entry() with respect to the sk_node field.
However entries in the tb->owners list are inserted with respect to the
sk_bind_node field with sk_add_bind_node().
Thus the check would never pass and the fast path never execute.

This fast path has never been executed or tested as this bug seems
to be present since commit 1da177e4c3f4 ("Linux-2.6.12-rc2"), thus
remove it to reduce code complexity.

Signed-off-by: Pietro Borrello <borrello@diag.uniroma1.it>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20230112-inet_hash_connect_bind_head-v3-1-b591fd212b93@diag.uniroma1.it
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/inet_hashtables.c

index 24a38b56fab9e9d7d893e23b30d26e275359ec70..b97dd10e02a7594764498a6d780b3682013accfe 100644 (file)
@@ -995,17 +995,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
        u32 index;
 
        if (port) {
-               head = &hinfo->bhash[inet_bhashfn(net, port,
-                                                 hinfo->bhash_size)];
-               tb = inet_csk(sk)->icsk_bind_hash;
-               spin_lock_bh(&head->lock);
-               if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
-                       inet_ehash_nolisten(sk, NULL, NULL);
-                       spin_unlock_bh(&head->lock);
-                       return 0;
-               }
-               spin_unlock(&head->lock);
-               /* No definite answer... Walk to established hash table */
+               local_bh_disable();
                ret = check_established(death_row, sk, port, NULL);
                local_bh_enable();
                return ret;