diff options
author | David S. Miller | 2019-04-10 22:07:02 +0200 |
---|---|---|
committer | David S. Miller | 2019-04-10 22:07:02 +0200 |
commit | 44f5e0480752b356f577aef90a5813299c3c60b1 (patch) | |
tree | 745bb98ce86c2b200e8d2c642ddcf65c4cb9a2ef /net/tls/tls_main.c | |
parent | Merge branch 'ibmvnic-features' (diff) | |
parent | net: strparser: partially revert "strparser: Call skb_unclone conditionally" (diff) | |
download | kernel-qcow2-linux-44f5e0480752b356f577aef90a5813299c3c60b1.tar.gz kernel-qcow2-linux-44f5e0480752b356f577aef90a5813299c3c60b1.tar.xz kernel-qcow2-linux-44f5e0480752b356f577aef90a5813299c3c60b1.zip |
Merge branch 'tls-leaks'
Jakub Kicinski says:
====================
net: tls: fix memory leaks and freeing skbs
This series fixes two memory issues and a stack overflow.
First two patches are fairly simple leaks. Third patch
partially reverts an optimization made to the strparser
which causes creation of skb->frag_list->skb->frag_list...
chains of 100s of skbs, leading to recursive kfree_skb()
filling up the kernel stack.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tls/tls_main.c')
-rw-r--r-- | net/tls/tls_main.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c index df921a2904b9..a3cca1ef0098 100644 --- a/net/tls/tls_main.c +++ b/net/tls/tls_main.c @@ -208,6 +208,26 @@ int tls_push_partial_record(struct sock *sk, struct tls_context *ctx, return tls_push_sg(sk, ctx, sg, offset, flags); } +bool tls_free_partial_record(struct sock *sk, struct tls_context *ctx) +{ + struct scatterlist *sg; + + sg = ctx->partially_sent_record; + if (!sg) + return false; + + while (1) { + put_page(sg_page(sg)); + sk_mem_uncharge(sk, sg->length); + + if (sg_is_last(sg)) + break; + sg++; + } + ctx->partially_sent_record = NULL; + return true; +} + static void tls_write_space(struct sock *sk) { struct tls_context *ctx = tls_get_ctx(sk); @@ -267,6 +287,8 @@ static void tls_sk_proto_close(struct sock *sk, long timeout) kfree(ctx->tx.rec_seq); kfree(ctx->tx.iv); tls_sw_free_resources_tx(sk); + } else if (ctx->tx_conf == TLS_HW) { + tls_device_free_resources_tx(sk); } if (ctx->rx_conf == TLS_SW) { |