crypto: testmgr - don't use interruptible wait in tests
authorRabin Vincent <rabin.vincent@axis.com>
Fri, 9 Jan 2015 15:25:28 +0000 (16:25 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 13 Jan 2015 11:30:44 +0000 (22:30 +1100)
tcrypt/testmgr uses wait_for_completion_interruptible() everywhere when
it waits for a request to be completed.  If it's interrupted, then the
test is aborted and the request is freed.

However, if any of these calls actually do get interrupted, the result
will likely be a kernel crash, when the driver handles the now-freed
request.  Use wait_for_completion() instead.

Signed-off-by: Rabin Vincent <rabin.vincent@axis.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/tcrypt.c
crypto/testmgr.c

index 1d864e988ea9f44b76db78c7f2395fecb1623089..004349576ba13ab98d0e24f68c2ad94863e613c7 100644 (file)
@@ -764,10 +764,9 @@ static inline int do_one_ahash_op(struct ahash_request *req, int ret)
        if (ret == -EINPROGRESS || ret == -EBUSY) {
                struct tcrypt_result *tr = req->base.data;
 
-               ret = wait_for_completion_interruptible(&tr->completion);
-               if (!ret)
-                       ret = tr->err;
+               wait_for_completion(&tr->completion);
                reinit_completion(&tr->completion);
+               ret = tr->err;
        }
        return ret;
 }
@@ -993,10 +992,9 @@ static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
        if (ret == -EINPROGRESS || ret == -EBUSY) {
                struct tcrypt_result *tr = req->base.data;
 
-               ret = wait_for_completion_interruptible(&tr->completion);
-               if (!ret)
-                       ret = tr->err;
+               wait_for_completion(&tr->completion);
                reinit_completion(&tr->completion);
+               ret = tr->err;
        }
 
        return ret;
index 037368d34586706e69275e1319f4514ad32d05a4..235b1fff04c4b042955bdc252babdb9d3d296c1b 100644 (file)
@@ -181,10 +181,9 @@ static void testmgr_free_buf(char *buf[XBUFSIZE])
 static int wait_async_op(struct tcrypt_result *tr, int ret)
 {
        if (ret == -EINPROGRESS || ret == -EBUSY) {
-               ret = wait_for_completion_interruptible(&tr->completion);
-               if (!ret)
-                       ret = tr->err;
+               wait_for_completion(&tr->completion);
                reinit_completion(&tr->completion);
+               ret = tr->err;
        }
        return ret;
 }
@@ -353,12 +352,11 @@ static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
                        break;
                case -EINPROGRESS:
                case -EBUSY:
-                       ret = wait_for_completion_interruptible(
-                               &tresult.completion);
-                       if (!ret && !(ret = tresult.err)) {
-                               reinit_completion(&tresult.completion);
+                       wait_for_completion(&tresult.completion);
+                       reinit_completion(&tresult.completion);
+                       ret = tresult.err;
+                       if (!ret)
                                break;
-                       }
                        /* fall through */
                default:
                        printk(KERN_ERR "alg: hash: digest failed "
@@ -569,12 +567,11 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
                        break;
                case -EINPROGRESS:
                case -EBUSY:
-                       ret = wait_for_completion_interruptible(
-                               &result.completion);
-                       if (!ret && !(ret = result.err)) {
-                               reinit_completion(&result.completion);
+                       wait_for_completion(&result.completion);
+                       reinit_completion(&result.completion);
+                       ret = result.err;
+                       if (!ret)
                                break;
-                       }
                case -EBADMSG:
                        if (template[i].novrfy)
                                /* verification failure was expected */
@@ -720,12 +717,11 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
                        break;
                case -EINPROGRESS:
                case -EBUSY:
-                       ret = wait_for_completion_interruptible(
-                               &result.completion);
-                       if (!ret && !(ret = result.err)) {
-                               reinit_completion(&result.completion);
+                       wait_for_completion(&result.completion);
+                       reinit_completion(&result.completion);
+                       ret = result.err;
+                       if (!ret)
                                break;
-                       }
                case -EBADMSG:
                        if (template[i].novrfy)
                                /* verification failure was expected */
@@ -1002,12 +998,11 @@ static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                        break;
                case -EINPROGRESS:
                case -EBUSY:
-                       ret = wait_for_completion_interruptible(
-                               &result.completion);
-                       if (!ret && !((ret = result.err))) {
-                               reinit_completion(&result.completion);
+                       wait_for_completion(&result.completion);
+                       reinit_completion(&result.completion);
+                       ret = result.err;
+                       if (!ret)
                                break;
-                       }
                        /* fall through */
                default:
                        pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
@@ -1097,12 +1092,11 @@ static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                        break;
                case -EINPROGRESS:
                case -EBUSY:
-                       ret = wait_for_completion_interruptible(
-                                       &result.completion);
-                       if (!ret && !((ret = result.err))) {
-                               reinit_completion(&result.completion);
+                       wait_for_completion(&result.completion);
+                       reinit_completion(&result.completion);
+                       ret = result.err;
+                       if (!ret)
                                break;
-                       }
                        /* fall through */
                default:
                        pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",