summaryrefslogtreecommitdiffstats
path: root/tools/pcmcia
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2024-03-08 12:01:21 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-05-02 16:17:13 +0200
commit4212fa80f700b06358a13cc7ea9d25788beff877 (patch)
tree82e2969554d81175b17fcb21ac7510832064c2d3 /tools/pcmcia
parent9f06ebd1daf5914afb21b95781cf637a025e9f9a (diff)
downloadlinux-stable-4212fa80f700b06358a13cc7ea9d25788beff877.tar.gz
linux-stable-4212fa80f700b06358a13cc7ea9d25788beff877.tar.bz2
linux-stable-4212fa80f700b06358a13cc7ea9d25788beff877.zip
tcp: Fix NEW_SYN_RECV handling in inet_twsk_purge()
commit 1c4e97dd2d3c9a3e84f7e26346aa39bc426d3249 upstream. inet_twsk_purge() uses rcu to find TIME_WAIT and NEW_SYN_RECV objects to purge. These objects use SLAB_TYPESAFE_BY_RCU semantic and need special care. We need to use refcount_inc_not_zero(&sk->sk_refcnt). Reuse the existing correct logic I wrote for TIME_WAIT, because both structures have common locations for sk_state, sk_family, and netns pointer. If after the refcount_inc_not_zero() the object fields longer match the keys, use sock_gen_put(sk) to release the refcount. Then we can call inet_twsk_deschedule_put() for TIME_WAIT, inet_csk_reqsk_queue_drop_and_put() for NEW_SYN_RECV sockets, with BH disabled. Then we need to restart the loop because we had drop rcu_read_lock(). Fixes: 740ea3c4a0b2 ("tcp: Clean up kernel listener's reqsk in inet_twsk_purge()") Link: https://lore.kernel.org/netdev/CANn89iLvFuuihCtt9PME2uS1WJATnf5fKjDToa1WzVnRzHnPfg@mail.gmail.com/T/#u Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://lore.kernel.org/r/20240308200122.64357-2-kuniyu@amazon.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> [shaozhengchao: resolved conflicts in 5.10] Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'tools/pcmcia')
0 files changed, 0 insertions, 0 deletions