diff options
author | David S. Miller <davem@davemloft.net> | 2018-07-29 08:53:31 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-07-29 08:53:31 +0300 |
commit | d339377c0447b08cd207ff21f621d5e9460c9b9f (patch) | |
tree | 6dd8ede8accd1eb18152b00f6004d7df14d42b37 | |
parent | 37b81dc5ed31d497a6f1ab2bf8578f2343b349ef (diff) | |
parent | 2da19ed3e4a87db16c0f69039da9f17a9596c350 (diff) | |
download | linux-d339377c0447b08cd207ff21f621d5e9460c9b9f.tar.xz |
Merge branch 'tls-Fix-improper-revert-in-zerocopy_from_iter'
Doron Roberts-Kedes says:
====================
tls: Fix improper revert in zerocopy_from_iter
This series fixes the improper iov_iter_revert introcded in
"tls: Fix zerocopy_from_iter iov handling".
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/tls/tls_sw.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index f9971717f7e0..6deceb7c56ba 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -263,7 +263,7 @@ static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from, int length, int *pages_used, unsigned int *size_used, struct scatterlist *to, int to_max_pages, - bool charge, bool revert) + bool charge) { struct page *pages[MAX_SKB_FRAGS]; @@ -312,10 +312,10 @@ static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from, } out: + if (rc) + iov_iter_revert(from, size - *size_used); *size_used = size; *pages_used = num_elem; - if (revert) - iov_iter_revert(from, size); return rc; } @@ -417,21 +417,17 @@ alloc_encrypted: &ctx->sg_plaintext_size, ctx->sg_plaintext_data, ARRAY_SIZE(ctx->sg_plaintext_data), - true, false); + true); if (ret) goto fallback_to_reg_send; copied += try_to_copy; ret = tls_push_record(sk, msg->msg_flags, record_type); - if (!ret) - continue; - if (ret < 0) + if (ret) goto send_end; + continue; - copied -= try_to_copy; fallback_to_reg_send: - iov_iter_revert(&msg->msg_iter, - ctx->sg_plaintext_size - orig_size); trim_sg(sk, ctx->sg_plaintext_data, &ctx->sg_plaintext_num_elem, &ctx->sg_plaintext_size, @@ -836,7 +832,7 @@ int tls_sw_recvmsg(struct sock *sk, err = zerocopy_from_iter(sk, &msg->msg_iter, to_copy, &pages, &chunk, &sgin[1], - MAX_SKB_FRAGS, false, true); + MAX_SKB_FRAGS, false); if (err < 0) goto fallback_to_reg_recv; |