diff options
Diffstat (limited to 'net/ipv4/tcp_minisocks.c')
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 550e755747e0..3cabafb5cdd1 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -359,13 +359,11 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) | |||
359 | */ | 359 | */ |
360 | do { | 360 | do { |
361 | struct tcp_md5sig_key *key; | 361 | struct tcp_md5sig_key *key; |
362 | memset(tcptw->tw_md5_key, 0, sizeof(tcptw->tw_md5_key)); | 362 | tcptw->tw_md5_key = NULL; |
363 | tcptw->tw_md5_keylen = 0; | ||
364 | key = tp->af_specific->md5_lookup(sk, sk); | 363 | key = tp->af_specific->md5_lookup(sk, sk); |
365 | if (key != NULL) { | 364 | if (key != NULL) { |
366 | memcpy(&tcptw->tw_md5_key, key->key, key->keylen); | 365 | tcptw->tw_md5_key = kmemdup(key, sizeof(*key), GFP_ATOMIC); |
367 | tcptw->tw_md5_keylen = key->keylen; | 366 | if (tcptw->tw_md5_key && tcp_alloc_md5sig_pool(sk) == NULL) |
368 | if (tcp_alloc_md5sig_pool(sk) == NULL) | ||
369 | BUG(); | 367 | BUG(); |
370 | } | 368 | } |
371 | } while (0); | 369 | } while (0); |
@@ -405,8 +403,10 @@ void tcp_twsk_destructor(struct sock *sk) | |||
405 | { | 403 | { |
406 | #ifdef CONFIG_TCP_MD5SIG | 404 | #ifdef CONFIG_TCP_MD5SIG |
407 | struct tcp_timewait_sock *twsk = tcp_twsk(sk); | 405 | struct tcp_timewait_sock *twsk = tcp_twsk(sk); |
408 | if (twsk->tw_md5_keylen) | 406 | if (twsk->tw_md5_key) { |
409 | tcp_free_md5sig_pool(); | 407 | tcp_free_md5sig_pool(); |
408 | kfree_rcu(twsk->tw_md5_key, rcu); | ||
409 | } | ||
410 | #endif | 410 | #endif |
411 | } | 411 | } |
412 | EXPORT_SYMBOL_GPL(tcp_twsk_destructor); | 412 | EXPORT_SYMBOL_GPL(tcp_twsk_destructor); |