aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/af_alg.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@lithui.me.apana.org.au>2017-12-22 04:00:50 -0500
committerHerbert Xu <herbert@lithui.me.apana.org.au>2017-12-22 04:00:50 -0500
commit45fa9a324d0f5be9140ba2e0db9b8fb8a0b9b7e8 (patch)
treea5e7c8428030ec0462b58133d6548ddff3802018 /crypto/af_alg.c
parentfc8517bf627c9b834f80274a1bc9ecd39b27231b (diff)
parent2973633e9f09311e849f975d969737af81a521ff (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Merge the crypto tree to pick up inside-secure fixes.
Diffstat (limited to 'crypto/af_alg.c')
-rw-r--r--crypto/af_alg.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/crypto/af_alg.c b/crypto/af_alg.c
index 1e5353f62067..35d4dcea381f 100644
--- a/crypto/af_alg.c
+++ b/crypto/af_alg.c
@@ -664,7 +664,7 @@ void af_alg_free_areq_sgls(struct af_alg_async_req *areq)
664 unsigned int i; 664 unsigned int i;
665 665
666 list_for_each_entry_safe(rsgl, tmp, &areq->rsgl_list, list) { 666 list_for_each_entry_safe(rsgl, tmp, &areq->rsgl_list, list) {
667 ctx->rcvused -= rsgl->sg_num_bytes; 667 atomic_sub(rsgl->sg_num_bytes, &ctx->rcvused);
668 af_alg_free_sg(&rsgl->sgl); 668 af_alg_free_sg(&rsgl->sgl);
669 list_del(&rsgl->list); 669 list_del(&rsgl->list);
670 if (rsgl != &areq->first_rsgl) 670 if (rsgl != &areq->first_rsgl)
@@ -1022,6 +1022,18 @@ unlock:
1022EXPORT_SYMBOL_GPL(af_alg_sendpage); 1022EXPORT_SYMBOL_GPL(af_alg_sendpage);
1023 1023
1024/** 1024/**
1025 * af_alg_free_resources - release resources required for crypto request
1026 */
1027void af_alg_free_resources(struct af_alg_async_req *areq)
1028{
1029 struct sock *sk = areq->sk;
1030
1031 af_alg_free_areq_sgls(areq);
1032 sock_kfree_s(sk, areq, areq->areqlen);
1033}
1034EXPORT_SYMBOL_GPL(af_alg_free_resources);
1035
1036/**
1025 * af_alg_async_cb - AIO callback handler 1037 * af_alg_async_cb - AIO callback handler
1026 * 1038 *
1027 * This handler cleans up the struct af_alg_async_req upon completion of the 1039 * This handler cleans up the struct af_alg_async_req upon completion of the
@@ -1037,18 +1049,13 @@ void af_alg_async_cb(struct crypto_async_request *_req, int err)
1037 struct kiocb *iocb = areq->iocb; 1049 struct kiocb *iocb = areq->iocb;
1038 unsigned int resultlen; 1050 unsigned int resultlen;
1039 1051
1040 lock_sock(sk);
1041
1042 /* Buffer size written by crypto operation. */ 1052 /* Buffer size written by crypto operation. */
1043 resultlen = areq->outlen; 1053 resultlen = areq->outlen;
1044 1054
1045 af_alg_free_areq_sgls(areq); 1055 af_alg_free_resources(areq);
1046 sock_kfree_s(sk, areq, areq->areqlen); 1056 sock_put(sk);
1047 __sock_put(sk);
1048 1057
1049 iocb->ki_complete(iocb, err ? err : resultlen, 0); 1058 iocb->ki_complete(iocb, err ? err : resultlen, 0);
1050
1051 release_sock(sk);
1052} 1059}
1053EXPORT_SYMBOL_GPL(af_alg_async_cb); 1060EXPORT_SYMBOL_GPL(af_alg_async_cb);
1054 1061
@@ -1131,12 +1138,6 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
1131 if (!af_alg_readable(sk)) 1138 if (!af_alg_readable(sk))
1132 break; 1139 break;
1133 1140
1134 if (!ctx->used) {
1135 err = af_alg_wait_for_data(sk, flags);
1136 if (err)
1137 return err;
1138 }
1139
1140 seglen = min_t(size_t, (maxsize - len), 1141 seglen = min_t(size_t, (maxsize - len),
1141 msg_data_left(msg)); 1142 msg_data_left(msg));
1142 1143
@@ -1162,7 +1163,7 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
1162 1163
1163 areq->last_rsgl = rsgl; 1164 areq->last_rsgl = rsgl;
1164 len += err; 1165 len += err;
1165 ctx->rcvused += err; 1166 atomic_add(err, &ctx->rcvused);
1166 rsgl->sg_num_bytes = err; 1167 rsgl->sg_num_bytes = err;
1167 iov_iter_advance(&msg->msg_iter, err); 1168 iov_iter_advance(&msg->msg_iter, err);
1168 } 1169 }