diff options
author | Herbert Xu <herbert@lithui.me.apana.org.au> | 2017-12-22 04:00:50 -0500 |
---|---|---|
committer | Herbert Xu <herbert@lithui.me.apana.org.au> | 2017-12-22 04:00:50 -0500 |
commit | 45fa9a324d0f5be9140ba2e0db9b8fb8a0b9b7e8 (patch) | |
tree | a5e7c8428030ec0462b58133d6548ddff3802018 /crypto/af_alg.c | |
parent | fc8517bf627c9b834f80274a1bc9ecd39b27231b (diff) | |
parent | 2973633e9f09311e849f975d969737af81a521ff (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.c | 31 |
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: | |||
1022 | EXPORT_SYMBOL_GPL(af_alg_sendpage); | 1022 | EXPORT_SYMBOL_GPL(af_alg_sendpage); |
1023 | 1023 | ||
1024 | /** | 1024 | /** |
1025 | * af_alg_free_resources - release resources required for crypto request | ||
1026 | */ | ||
1027 | void 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 | } | ||
1034 | EXPORT_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 | } |
1053 | EXPORT_SYMBOL_GPL(af_alg_async_cb); | 1060 | EXPORT_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 | } |