diff options
Diffstat (limited to 'net/core/sock.c')
-rw-r--r-- | net/core/sock.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index a96d5f7a5734..2c4f574168fb 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1442,6 +1442,11 @@ static void __sk_destruct(struct rcu_head *head) | |||
1442 | pr_debug("%s: optmem leakage (%d bytes) detected\n", | 1442 | pr_debug("%s: optmem leakage (%d bytes) detected\n", |
1443 | __func__, atomic_read(&sk->sk_omem_alloc)); | 1443 | __func__, atomic_read(&sk->sk_omem_alloc)); |
1444 | 1444 | ||
1445 | if (sk->sk_frag.page) { | ||
1446 | put_page(sk->sk_frag.page); | ||
1447 | sk->sk_frag.page = NULL; | ||
1448 | } | ||
1449 | |||
1445 | if (sk->sk_peer_cred) | 1450 | if (sk->sk_peer_cred) |
1446 | put_cred(sk->sk_peer_cred); | 1451 | put_cred(sk->sk_peer_cred); |
1447 | put_pid(sk->sk_peer_pid); | 1452 | put_pid(sk->sk_peer_pid); |
@@ -1539,6 +1544,12 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | |||
1539 | is_charged = sk_filter_charge(newsk, filter); | 1544 | is_charged = sk_filter_charge(newsk, filter); |
1540 | 1545 | ||
1541 | if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) { | 1546 | if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) { |
1547 | /* We need to make sure that we don't uncharge the new | ||
1548 | * socket if we couldn't charge it in the first place | ||
1549 | * as otherwise we uncharge the parent's filter. | ||
1550 | */ | ||
1551 | if (!is_charged) | ||
1552 | RCU_INIT_POINTER(newsk->sk_filter, NULL); | ||
1542 | sk_free_unlock_clone(newsk); | 1553 | sk_free_unlock_clone(newsk); |
1543 | newsk = NULL; | 1554 | newsk = NULL; |
1544 | goto out; | 1555 | goto out; |
@@ -2787,11 +2798,6 @@ void sk_common_release(struct sock *sk) | |||
2787 | 2798 | ||
2788 | sk_refcnt_debug_release(sk); | 2799 | sk_refcnt_debug_release(sk); |
2789 | 2800 | ||
2790 | if (sk->sk_frag.page) { | ||
2791 | put_page(sk->sk_frag.page); | ||
2792 | sk->sk_frag.page = NULL; | ||
2793 | } | ||
2794 | |||
2795 | sock_put(sk); | 2801 | sock_put(sk); |
2796 | } | 2802 | } |
2797 | EXPORT_SYMBOL(sk_common_release); | 2803 | EXPORT_SYMBOL(sk_common_release); |