Patch "crypto: marvell - properly handle CRYPTO_TFM_REQ_MAY_BACKLOG-flagged requests" has been added to the 4.2-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
crypto: marvell - properly handle CRYPTO_TFM_REQ_MAY_BACKLOG-flagged requests
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
crypto-marvell-properly-handle-crypto_tfm_req_may_backlog-flagged-requests.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
cfcd2271a9076a9891014bc8e18d4fd48acccffeMon Sep 17 00:00:00 2001
From: Thomas Petazzoni <[email protected]>
Date: Fri, 18 Sep 2015 17:25:36 +0200
Subject: crypto: marvell - properly handle CRYPTO_TFM_REQ_MAY_BACKLOG-flagged requests
From: Thomas Petazzoni <[email protected]>
commit cfcd2271a9076a9891014bc8e18d4fd48acccffe upstream.
The mv_cesa_queue_req() function calls crypto_enqueue_request() to enqueue a request. In the normal case (i.e the queue isn't full), this function returns -EINPROGRESS. The current Marvell CESA crypto driver takes this into account and cleans up the request only if an error occured, i.e if the return value is not -EINPROGRESS.
Unfortunately this causes problems with CRYPTO_TFM_REQ_MAY_BACKLOG-flagged requests. When such a request is passed to crypto_enqueue_request() and the queue is full, crypto_enqueue_request() will return -EBUSY, but will keep the request enqueued nonetheless. This situation was not properly handled by the Marvell CESA driver, which was anyway cleaning up the request in such a situation. When later on the request was taken out of the backlog and actually processed, a kernel crash occured due to the internal driver data structures for this structure having been cleaned up.
To avoid this situation, this commit adds a mv_cesa_req_needs_cleanup() helper function which indicates if the request needs to be cleaned up or not after a call to crypto_enqueue_request(). This helper allows to do the cleanup only in the appropriate cases, and all call sites of mv_cesa_queue_req() are fixed to use this new helper function.
--- drivers/crypto/marvell/cesa.h | 27 +++++++++++++++++++++++++++ drivers/crypto/marvell/cipher.c | 7 +++---- drivers/crypto/marvell/hash.c | 8 +++----- 3 files changed, 33 insertions(+), 9 deletions(-)
drivers/crypto/marvell/cesa.h +27 -0
@@ -687,6 +687,33 @@ static inline u32 mv_cesa_get_int_mask(sint mv_cesa_queue_req (struct crypto_async_request *req); +/* +* Helper function that indicates whether a crypto request needs to be +* cleaned up or not after being enqueued using mv_cesa_queue_req(). +*/ +static inline int mv_cesa_req_needs_cleanup (struct crypto_async_request *req, +int ret) +{ +/* +* The queue still had some space, the request was queued +* normally, so there's no need to clean it up. +*/ +if (ret == -EINPROGRESS ) +return false; + +/* +* The queue had not space left, but since the request is +* flagged with CRYPTO_TFM_REQ_MAY_BACKLOG, it was added to +* the backlog and will be processed later. There's no need to +* clean it up. +*/ +if (ret == -EBUSY && req->flags &CRYPTO_TFM_REQ_MAY_BACKLOG ) +return false; + +/* Request wasn't queued, we need to clean it up */ +return true; +} +/* TDMA functions */ static inline void mv_cesa_req_dma_iter_init(struct mv_cesa_dma_iter *iter,
drivers/crypto/marvell/cipher.c +3 -4
@@ -189,7 +189,6 @@ static inline void mv_cesa_ablkcipher_pr {struct ablkcipher_request *ablkreq =ablkcipher_request_cast (req);struct mv_cesa_ablkcipher_req *creq =ablkcipher_request_ctx (ablkreq); - creq->req.base.engine = engine;if (creq->req.base.type ==CESA_DMA_REQ )
@@ -431,7 +430,7 @@ static int mv_cesa_des_op(struct ablkcipreturn ret; ret =mv_cesa_queue_req (&req->base); -if (ret && ret != -EINPROGRESS ) +if (mv_cesa_req_needs_cleanup (&req->base, ret))mv_cesa_ablkcipher_cleanup (req);return ret;
@@ -551,7 +550,7 @@ static int mv_cesa_des3_op(struct ablkcireturn ret; ret =mv_cesa_queue_req (&req->base); -if (ret && ret != -EINPROGRESS ) +if (mv_cesa_req_needs_cleanup (&req->base, ret))mv_cesa_ablkcipher_cleanup (req);return ret;
@@ -693,7 +692,7 @@ static int mv_cesa_aes_op(struct ablkcipreturn ret; ret =mv_cesa_queue_req (&req->base); -if (ret && ret != -EINPROGRESS ) +if (mv_cesa_req_needs_cleanup (&req->base, ret))mv_cesa_ablkcipher_cleanup (req);return ret;
drivers/crypto/marvell/hash.c +3 -5
@@ -739,10 +739,8 @@ static int mv_cesa_ahash_update(struct areturn 0 ; ret =mv_cesa_queue_req (&req->base); -if (ret && ret != -EINPROGRESS ) { +if (mv_cesa_req_needs_cleanup (&req->base, ret))mv_cesa_ahash_cleanup (req); -return ret; - }return ret; }
@@ -766,7 +764,7 @@ static int mv_cesa_ahash_final(struct ahreturn 0 ; ret =mv_cesa_queue_req (&req->base); -if (ret && ret != -EINPROGRESS ) +if (mv_cesa_req_needs_cleanup (&req->base, ret))mv_cesa_ahash_cleanup (req);return ret;
@@ -791,7 +789,7 @@ static int mv_cesa_ahash_finup(struct ahreturn 0 ; ret =mv_cesa_queue_req (&req->base); -if (ret && ret != -EINPROGRESS ) +if (mv_cesa_req_needs_cleanup (&req->base, ret))mv_cesa_ahash_cleanup (req);return ret;
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/crypto-marvell-properly-handle-crypto_tfm_req_may_backlog-flagged-requests.patch