Commit 872ac874 authored by Herbert Xu's avatar Herbert Xu

crypto: chainiv - Invoke completion function

When chainiv postpones requests it never calls their completion functions.
This causes symptoms such as memory leaks when IPsec is in use.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 6329d302
...@@ -117,6 +117,7 @@ static int chainiv_init(struct crypto_tfm *tfm) ...@@ -117,6 +117,7 @@ static int chainiv_init(struct crypto_tfm *tfm)
static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
{ {
int queued; int queued;
int err = ctx->err;
if (!ctx->queue.qlen) { if (!ctx->queue.qlen) {
smp_mb__before_clear_bit(); smp_mb__before_clear_bit();
...@@ -131,7 +132,7 @@ static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) ...@@ -131,7 +132,7 @@ static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
BUG_ON(!queued); BUG_ON(!queued);
out: out:
return ctx->err; return err;
} }
static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req) static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req)
...@@ -227,6 +228,7 @@ static void async_chainiv_do_postponed(struct work_struct *work) ...@@ -227,6 +228,7 @@ static void async_chainiv_do_postponed(struct work_struct *work)
postponed); postponed);
struct skcipher_givcrypt_request *req; struct skcipher_givcrypt_request *req;
struct ablkcipher_request *subreq; struct ablkcipher_request *subreq;
int err;
/* Only handle one request at a time to avoid hogging keventd. */ /* Only handle one request at a time to avoid hogging keventd. */
spin_lock_bh(&ctx->lock); spin_lock_bh(&ctx->lock);
...@@ -241,7 +243,11 @@ static void async_chainiv_do_postponed(struct work_struct *work) ...@@ -241,7 +243,11 @@ static void async_chainiv_do_postponed(struct work_struct *work)
subreq = skcipher_givcrypt_reqctx(req); subreq = skcipher_givcrypt_reqctx(req);
subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP; subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP;
async_chainiv_givencrypt_tail(req); err = async_chainiv_givencrypt_tail(req);
local_bh_disable();
skcipher_givcrypt_complete(req, err);
local_bh_enable();
} }
static int async_chainiv_init(struct crypto_tfm *tfm) static int async_chainiv_init(struct crypto_tfm *tfm)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment