diff options
Diffstat (limited to 'crypto/algif_skcipher.c')
-rw-r--r-- | crypto/algif_skcipher.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index 30cff827dd8f..baef9bfccdda 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c | |||
@@ -72,6 +72,12 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, | |||
72 | int err = 0; | 72 | int err = 0; |
73 | size_t len = 0; | 73 | size_t len = 0; |
74 | 74 | ||
75 | if (!ctx->used) { | ||
76 | err = af_alg_wait_for_data(sk, flags); | ||
77 | if (err) | ||
78 | return err; | ||
79 | } | ||
80 | |||
75 | /* Allocate cipher request for current operation. */ | 81 | /* Allocate cipher request for current operation. */ |
76 | areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) + | 82 | areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) + |
77 | crypto_skcipher_reqsize(tfm)); | 83 | crypto_skcipher_reqsize(tfm)); |
@@ -119,6 +125,10 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, | |||
119 | /* AIO operation */ | 125 | /* AIO operation */ |
120 | sock_hold(sk); | 126 | sock_hold(sk); |
121 | areq->iocb = msg->msg_iocb; | 127 | areq->iocb = msg->msg_iocb; |
128 | |||
129 | /* Remember output size that will be generated. */ | ||
130 | areq->outlen = len; | ||
131 | |||
122 | skcipher_request_set_callback(&areq->cra_u.skcipher_req, | 132 | skcipher_request_set_callback(&areq->cra_u.skcipher_req, |
123 | CRYPTO_TFM_REQ_MAY_SLEEP, | 133 | CRYPTO_TFM_REQ_MAY_SLEEP, |
124 | af_alg_async_cb, areq); | 134 | af_alg_async_cb, areq); |
@@ -127,12 +137,8 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, | |||
127 | crypto_skcipher_decrypt(&areq->cra_u.skcipher_req); | 137 | crypto_skcipher_decrypt(&areq->cra_u.skcipher_req); |
128 | 138 | ||
129 | /* AIO operation in progress */ | 139 | /* AIO operation in progress */ |
130 | if (err == -EINPROGRESS || err == -EBUSY) { | 140 | if (err == -EINPROGRESS || err == -EBUSY) |
131 | /* Remember output size that will be generated. */ | ||
132 | areq->outlen = len; | ||
133 | |||
134 | return -EIOCBQUEUED; | 141 | return -EIOCBQUEUED; |
135 | } | ||
136 | 142 | ||
137 | sock_put(sk); | 143 | sock_put(sk); |
138 | } else { | 144 | } else { |