aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-10-19 06:23:57 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-10-20 09:59:25 -0400
commit3fc89adb9fa4beff31374a4bf50b3d099d88ae83 (patch)
treec9df7595414423aaadf10a8488a88a85139420a6
parent8996eafdcbad149ac0f772fb1649fbb75c482a6a (diff)
crypto: api - Only abort operations on fatal signal
Currently a number of Crypto API operations may fail when a signal occurs. This causes nasty problems as the caller of those operations are often not in a good position to restart the operation. In fact there is currently no need for those operations to be interrupted by user signals at all. All we need is for them to be killable. This patch replaces the relevant calls of signal_pending with fatal_signal_pending, and wait_for_completion_interruptible with wait_for_completion_killable, respectively. Cc: stable@vger.kernel.org Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/ablkcipher.c2
-rw-r--r--crypto/algapi.c2
-rw-r--r--crypto/api.c6
-rw-r--r--crypto/crypto_user.c2
4 files changed, 6 insertions, 6 deletions
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c
index b788f169cc98..b4ffc5be1a93 100644
--- a/crypto/ablkcipher.c
+++ b/crypto/ablkcipher.c
@@ -706,7 +706,7 @@ struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name,
706err: 706err:
707 if (err != -EAGAIN) 707 if (err != -EAGAIN)
708 break; 708 break;
709 if (signal_pending(current)) { 709 if (fatal_signal_pending(current)) {
710 err = -EINTR; 710 err = -EINTR;
711 break; 711 break;
712 } 712 }
diff --git a/crypto/algapi.c b/crypto/algapi.c
index d130b41dbaea..59bf491fe3d8 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -345,7 +345,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval)
345 crypto_alg_tested(larval->alg.cra_driver_name, 0); 345 crypto_alg_tested(larval->alg.cra_driver_name, 0);
346 } 346 }
347 347
348 err = wait_for_completion_interruptible(&larval->completion); 348 err = wait_for_completion_killable(&larval->completion);
349 WARN_ON(err); 349 WARN_ON(err);
350 350
351out: 351out:
diff --git a/crypto/api.c b/crypto/api.c
index afe4610afc4b..bbc147cb5dec 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -172,7 +172,7 @@ static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg)
172 struct crypto_larval *larval = (void *)alg; 172 struct crypto_larval *larval = (void *)alg;
173 long timeout; 173 long timeout;
174 174
175 timeout = wait_for_completion_interruptible_timeout( 175 timeout = wait_for_completion_killable_timeout(
176 &larval->completion, 60 * HZ); 176 &larval->completion, 60 * HZ);
177 177
178 alg = larval->adult; 178 alg = larval->adult;
@@ -445,7 +445,7 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask)
445err: 445err:
446 if (err != -EAGAIN) 446 if (err != -EAGAIN)
447 break; 447 break;
448 if (signal_pending(current)) { 448 if (fatal_signal_pending(current)) {
449 err = -EINTR; 449 err = -EINTR;
450 break; 450 break;
451 } 451 }
@@ -562,7 +562,7 @@ void *crypto_alloc_tfm(const char *alg_name,
562err: 562err:
563 if (err != -EAGAIN) 563 if (err != -EAGAIN)
564 break; 564 break;
565 if (signal_pending(current)) { 565 if (fatal_signal_pending(current)) {
566 err = -EINTR; 566 err = -EINTR;
567 break; 567 break;
568 } 568 }
diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c
index d94d99ffe8b9..237f3795cfaa 100644
--- a/crypto/crypto_user.c
+++ b/crypto/crypto_user.c
@@ -375,7 +375,7 @@ static struct crypto_alg *crypto_user_skcipher_alg(const char *name, u32 type,
375 err = PTR_ERR(alg); 375 err = PTR_ERR(alg);
376 if (err != -EAGAIN) 376 if (err != -EAGAIN)
377 break; 377 break;
378 if (signal_pending(current)) { 378 if (fatal_signal_pending(current)) {
379 err = -EINTR; 379 err = -EINTR;
380 break; 380 break;
381 } 381 }