|
@@ -117,6 +117,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
|
|
|
|
if (msg->msg_iocb && !is_sync_kiocb(msg->msg_iocb)) {
|
|
|
/* AIO operation */
|
|
|
+ sock_hold(sk);
|
|
|
areq->iocb = msg->msg_iocb;
|
|
|
skcipher_request_set_callback(&areq->cra_u.skcipher_req,
|
|
|
CRYPTO_TFM_REQ_MAY_SLEEP,
|
|
@@ -124,6 +125,16 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
|
err = ctx->enc ?
|
|
|
crypto_skcipher_encrypt(&areq->cra_u.skcipher_req) :
|
|
|
crypto_skcipher_decrypt(&areq->cra_u.skcipher_req);
|
|
|
+
|
|
|
+ /* AIO operation in progress */
|
|
|
+ if (err == -EINPROGRESS || err == -EBUSY) {
|
|
|
+ /* Remember output size that will be generated. */
|
|
|
+ areq->outlen = len;
|
|
|
+
|
|
|
+ return -EIOCBQUEUED;
|
|
|
+ }
|
|
|
+
|
|
|
+ sock_put(sk);
|
|
|
} else {
|
|
|
/* Synchronous operation */
|
|
|
skcipher_request_set_callback(&areq->cra_u.skcipher_req,
|
|
@@ -136,19 +147,9 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
|
&ctx->wait);
|
|
|
}
|
|
|
|
|
|
- /* AIO operation in progress */
|
|
|
- if (err == -EINPROGRESS) {
|
|
|
- sock_hold(sk);
|
|
|
-
|
|
|
- /* Remember output size that will be generated. */
|
|
|
- areq->outlen = len;
|
|
|
-
|
|
|
- return -EIOCBQUEUED;
|
|
|
- }
|
|
|
|
|
|
free:
|
|
|
- af_alg_free_areq_sgls(areq);
|
|
|
- sock_kfree_s(sk, areq, areq->areqlen);
|
|
|
+ af_alg_free_resources(areq);
|
|
|
|
|
|
return err ? err : len;
|
|
|
}
|