net/tcp: Separate initialization of twsk
Convert BUG_ON() to WARN_ON_ONCE() and warn as well for unlikely static key int overflow error-path. Signed-off-by: Dmitry Safonov <dima@arista.com> Acked-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b389d1affc
commit
c5b8b515a2
@ -240,6 +240,40 @@ kill:
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_timewait_state_process);
|
||||
|
||||
static void tcp_time_wait_init(struct sock *sk, struct tcp_timewait_sock *tcptw)
|
||||
{
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
const struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct tcp_md5sig_key *key;
|
||||
|
||||
/*
|
||||
* The timewait bucket does not have the key DB from the
|
||||
* sock structure. We just make a quick copy of the
|
||||
* md5 key being used (if indeed we are using one)
|
||||
* so the timewait ack generating code has the key.
|
||||
*/
|
||||
tcptw->tw_md5_key = NULL;
|
||||
if (!static_branch_unlikely(&tcp_md5_needed.key))
|
||||
return;
|
||||
|
||||
key = tp->af_specific->md5_lookup(sk, sk);
|
||||
if (key) {
|
||||
tcptw->tw_md5_key = kmemdup(key, sizeof(*key), GFP_ATOMIC);
|
||||
if (!tcptw->tw_md5_key)
|
||||
return;
|
||||
if (!tcp_alloc_md5sig_pool())
|
||||
goto out_free;
|
||||
if (!static_key_fast_inc_not_disabled(&tcp_md5_needed.key.key))
|
||||
goto out_free;
|
||||
}
|
||||
return;
|
||||
out_free:
|
||||
WARN_ON_ONCE(1);
|
||||
kfree(tcptw->tw_md5_key);
|
||||
tcptw->tw_md5_key = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Move a socket to time-wait or dead fin-wait-2 state.
|
||||
*/
|
||||
@ -282,32 +316,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
/*
|
||||
* The timewait bucket does not have the key DB from the
|
||||
* sock structure. We just make a quick copy of the
|
||||
* md5 key being used (if indeed we are using one)
|
||||
* so the timewait ack generating code has the key.
|
||||
*/
|
||||
do {
|
||||
tcptw->tw_md5_key = NULL;
|
||||
if (static_branch_unlikely(&tcp_md5_needed.key)) {
|
||||
struct tcp_md5sig_key *key;
|
||||
|
||||
key = tp->af_specific->md5_lookup(sk, sk);
|
||||
if (key) {
|
||||
tcptw->tw_md5_key = kmemdup(key, sizeof(*key), GFP_ATOMIC);
|
||||
if (!tcptw->tw_md5_key)
|
||||
break;
|
||||
BUG_ON(!tcp_alloc_md5sig_pool());
|
||||
if (!static_key_fast_inc_not_disabled(&tcp_md5_needed.key.key)) {
|
||||
kfree(tcptw->tw_md5_key);
|
||||
tcptw->tw_md5_key = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
#endif
|
||||
tcp_time_wait_init(sk, tcptw);
|
||||
|
||||
/* Get the TIME_WAIT timeout firing. */
|
||||
if (timeo < rto)
|
||||
|
Loading…
Reference in New Issue
Block a user