]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 8 Feb 2020 16:39:43 +0000 (17:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 8 Feb 2020 16:39:43 +0000 (17:39 +0100)
added patches:
crypto-api-fix-race-condition-in-crypto_spawn_alg.patch
crypto-pcrypt-do-not-clear-may_sleep-flag-in-original-request.patch
crypto-picoxcell-adjust-the-position-of-tasklet_init-and-fix-missed-tasklet_kill.patch

queue-4.4/crypto-api-fix-race-condition-in-crypto_spawn_alg.patch [new file with mode: 0644]
queue-4.4/crypto-pcrypt-do-not-clear-may_sleep-flag-in-original-request.patch [new file with mode: 0644]
queue-4.4/crypto-picoxcell-adjust-the-position-of-tasklet_init-and-fix-missed-tasklet_kill.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/crypto-api-fix-race-condition-in-crypto_spawn_alg.patch b/queue-4.4/crypto-api-fix-race-condition-in-crypto_spawn_alg.patch
new file mode 100644 (file)
index 0000000..bc22ed6
--- /dev/null
@@ -0,0 +1,82 @@
+From 73669cc556462f4e50376538d77ee312142e8a8a Mon Sep 17 00:00:00 2001
+From: Herbert Xu <herbert@gondor.apana.org.au>
+Date: Sat, 7 Dec 2019 22:15:15 +0800
+Subject: crypto: api - Fix race condition in crypto_spawn_alg
+
+From: Herbert Xu <herbert@gondor.apana.org.au>
+
+commit 73669cc556462f4e50376538d77ee312142e8a8a upstream.
+
+The function crypto_spawn_alg is racy because it drops the lock
+before shooting the dying algorithm.  The algorithm could disappear
+altogether before we shoot it.
+
+This patch fixes it by moving the shooting into the locked section.
+
+Fixes: 6bfd48096ff8 ("[CRYPTO] api: Added spawns")
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ crypto/algapi.c   |   16 +++++-----------
+ crypto/api.c      |    3 +--
+ crypto/internal.h |    1 -
+ 3 files changed, 6 insertions(+), 14 deletions(-)
+
+--- a/crypto/algapi.c
++++ b/crypto/algapi.c
+@@ -663,22 +663,16 @@ EXPORT_SYMBOL_GPL(crypto_drop_spawn);
+ static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn)
+ {
+       struct crypto_alg *alg;
+-      struct crypto_alg *alg2;
+       down_read(&crypto_alg_sem);
+       alg = spawn->alg;
+-      alg2 = alg;
+-      if (alg2)
+-              alg2 = crypto_mod_get(alg2);
+-      up_read(&crypto_alg_sem);
+-
+-      if (!alg2) {
+-              if (alg)
+-                      crypto_shoot_alg(alg);
+-              return ERR_PTR(-EAGAIN);
++      if (alg && !crypto_mod_get(alg)) {
++              alg->cra_flags |= CRYPTO_ALG_DYING;
++              alg = NULL;
+       }
++      up_read(&crypto_alg_sem);
+-      return alg;
++      return alg ?: ERR_PTR(-EAGAIN);
+ }
+ struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type,
+--- a/crypto/api.c
++++ b/crypto/api.c
+@@ -355,13 +355,12 @@ static unsigned int crypto_ctxsize(struc
+       return len;
+ }
+-void crypto_shoot_alg(struct crypto_alg *alg)
++static void crypto_shoot_alg(struct crypto_alg *alg)
+ {
+       down_write(&crypto_alg_sem);
+       alg->cra_flags |= CRYPTO_ALG_DYING;
+       up_write(&crypto_alg_sem);
+ }
+-EXPORT_SYMBOL_GPL(crypto_shoot_alg);
+ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
+                                     u32 mask)
+--- a/crypto/internal.h
++++ b/crypto/internal.h
+@@ -87,7 +87,6 @@ void crypto_alg_tested(const char *name,
+ void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,
+                         struct crypto_alg *nalg);
+ void crypto_remove_final(struct list_head *list);
+-void crypto_shoot_alg(struct crypto_alg *alg);
+ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
+                                     u32 mask);
+ void *crypto_create_tfm(struct crypto_alg *alg,
diff --git a/queue-4.4/crypto-pcrypt-do-not-clear-may_sleep-flag-in-original-request.patch b/queue-4.4/crypto-pcrypt-do-not-clear-may_sleep-flag-in-original-request.patch
new file mode 100644 (file)
index 0000000..44b907e
--- /dev/null
@@ -0,0 +1,33 @@
+From e8d998264bffade3cfe0536559f712ab9058d654 Mon Sep 17 00:00:00 2001
+From: Herbert Xu <herbert@gondor.apana.org.au>
+Date: Fri, 29 Nov 2019 16:40:24 +0800
+Subject: crypto: pcrypt - Do not clear MAY_SLEEP flag in original request
+
+From: Herbert Xu <herbert@gondor.apana.org.au>
+
+commit e8d998264bffade3cfe0536559f712ab9058d654 upstream.
+
+We should not be modifying the original request's MAY_SLEEP flag
+upon completion.  It makes no sense to do so anyway.
+
+Reported-by: Eric Biggers <ebiggers@kernel.org>
+Fixes: 5068c7a883d1 ("crypto: pcrypt - Add pcrypt crypto...")
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Tested-by: Eric Biggers <ebiggers@kernel.org>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ crypto/pcrypt.c |    1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/crypto/pcrypt.c
++++ b/crypto/pcrypt.c
+@@ -130,7 +130,6 @@ static void pcrypt_aead_done(struct cryp
+       struct padata_priv *padata = pcrypt_request_padata(preq);
+       padata->info = err;
+-      req->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+       padata_do_serial(padata);
+ }
diff --git a/queue-4.4/crypto-picoxcell-adjust-the-position-of-tasklet_init-and-fix-missed-tasklet_kill.patch b/queue-4.4/crypto-picoxcell-adjust-the-position-of-tasklet_init-and-fix-missed-tasklet_kill.patch
new file mode 100644 (file)
index 0000000..52c9882
--- /dev/null
@@ -0,0 +1,62 @@
+From 7f8c36fe9be46862c4f3c5302f769378028a34fa Mon Sep 17 00:00:00 2001
+From: Chuhong Yuan <hslester96@gmail.com>
+Date: Tue, 10 Dec 2019 00:21:44 +0800
+Subject: crypto: picoxcell - adjust the position of tasklet_init and fix missed tasklet_kill
+
+From: Chuhong Yuan <hslester96@gmail.com>
+
+commit 7f8c36fe9be46862c4f3c5302f769378028a34fa upstream.
+
+Since tasklet is needed to be initialized before registering IRQ
+handler, adjust the position of tasklet_init to fix the wrong order.
+
+Besides, to fix the missed tasklet_kill, this patch adds a helper
+function and uses devm_add_action to kill the tasklet automatically.
+
+Fixes: ce92136843cb ("crypto: picoxcell - add support for the picoxcell crypto engines")
+Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/crypto/picoxcell_crypto.c |   15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+--- a/drivers/crypto/picoxcell_crypto.c
++++ b/drivers/crypto/picoxcell_crypto.c
+@@ -1610,6 +1610,11 @@ static bool spacc_is_compatible(struct p
+       return false;
+ }
++static void spacc_tasklet_kill(void *data)
++{
++      tasklet_kill(data);
++}
++
+ static int spacc_probe(struct platform_device *pdev)
+ {
+       int i, err, ret = -EINVAL;
+@@ -1652,6 +1657,14 @@ static int spacc_probe(struct platform_d
+               return -ENXIO;
+       }
++      tasklet_init(&engine->complete, spacc_spacc_complete,
++                   (unsigned long)engine);
++
++      ret = devm_add_action(&pdev->dev, spacc_tasklet_kill,
++                            &engine->complete);
++      if (ret)
++              return ret;
++
+       if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0,
+                            engine->name, engine)) {
+               dev_err(engine->dev, "failed to request IRQ\n");
+@@ -1714,8 +1727,6 @@ static int spacc_probe(struct platform_d
+       INIT_LIST_HEAD(&engine->completed);
+       INIT_LIST_HEAD(&engine->in_progress);
+       engine->in_flight = 0;
+-      tasklet_init(&engine->complete, spacc_spacc_complete,
+-                   (unsigned long)engine);
+       platform_set_drvdata(pdev, engine);
index 587a8045aa37d0203a4df0db606bb7f68180be0b..413274aa61285fdb1c502029879fd4fb436c1faa 100644 (file)
@@ -25,3 +25,6 @@ revert-ovl-modify-ovl_permission-to-do-checks-on-two-inodes.patch
 of-add-of_dma_default_coherent-select-it-on-powerpc.patch
 dm-space-map-common-fix-to-ensure-new-block-isn-t-already-in-use.patch
 padata-remove-broken-queue-flushing.patch
+crypto-pcrypt-do-not-clear-may_sleep-flag-in-original-request.patch
+crypto-api-fix-race-condition-in-crypto_spawn_alg.patch
+crypto-picoxcell-adjust-the-position-of-tasklet_init-and-fix-missed-tasklet_kill.patch