crypto: testmgr - don't use interruptible wait in tests
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>
This commit is contained in:

committed by
Herbert Xu

parent
8155330aad
commit
8a45ac12ec
@@ -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",
|
||||
|
Reference in New Issue
Block a user