Thread (3 messages) flat view 3 messages, 2 authors, 2012-10-20
STALE5076d REVIEWED: 1 (0M)

1 review trailer.

[PATCH] crypto: cryptd - disable interrupts in cryptd_queue_worker to prevent data corruption

From: Jussi Kivilinna <hidden>
Date: 2012-10-20 09:13:19
Subsystem: crypto api, the rest · Maintainers: Herbert Xu, "David S. Miller", Linus Torvalds

cryptd_queue_worker attempts to prevent simultaneous accesses to crypto
workqueue by cryptd_enqueue_request using preempt_disable/preempt_enable.
However cryptd_enqueue_request might be called from interrupt context,
so add local_irq_save/local_irq_restore to prevent data corruption and
panics.

Bug report at http://marc.info/?l=linux-crypto-vger&m=134858649616319&w=2

Cc: stable@kernel.org
Reported-by: Gurucharan Shetty <redacted>
Tested-by: Gurucharan Shetty <redacted>
Signed-off-by: Jussi Kivilinna <redacted>
---
 crypto/cryptd.c |   11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/crypto/cryptd.c b/crypto/cryptd.c
index 671d4d6..8f62d06 100644
--- a/crypto/cryptd.c
+++ b/crypto/cryptd.c
@@ -133,16 +133,23 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue,
  * do. */
 static void cryptd_queue_worker(struct work_struct *work)
 {
+	unsigned long flags;
 	struct cryptd_cpu_queue *cpu_queue;
 	struct crypto_async_request *req, *backlog;
 
 	cpu_queue = container_of(work, struct cryptd_cpu_queue, work);
-	/* Only handle one request at a time to avoid hogging crypto
+	/*
+	 * Only handle one request at a time to avoid hogging crypto
 	 * workqueue. preempt_disable/enable is used to prevent
-	 * being preempted by cryptd_enqueue_request() */
+	 * being preempted by cryptd_enqueue_request(). local_irq_save/restore
+	 * is used to prevent cryptd_enqueue_request() being accessed from
+	 * interrupts.
+	 */
+	local_irq_save(flags);
 	preempt_disable();
 	backlog = crypto_get_backlog(&cpu_queue->queue);
 	req = crypto_dequeue_request(&cpu_queue->queue);
+	local_irq_restore(flags);
 	preempt_enable();
 
 	if (!req)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help