mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
inet: fix fast path in __inet_hash_connect()
[ Upstream commit21cbd90a6f] __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 commit1da177e4c3("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
47dc1f425a
commit
b33091fc28
@@ -760,17 +760,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
|||||||
u32 index;
|
u32 index;
|
||||||
|
|
||||||
if (port) {
|
if (port) {
|
||||||
head = &hinfo->bhash[inet_bhashfn(net, port,
|
local_bh_disable();
|
||||||
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 */
|
|
||||||
ret = check_established(death_row, sk, port, NULL);
|
ret = check_established(death_row, sk, port, NULL);
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user