diff options
| author | Eric Biggers <ebiggers@google.com> | 2016-11-23 10:24:35 -0800 | 
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-11-28 21:23:24 +0800 | 
| commit | eb0955935e2ae3aa1fc9c34ec684ffe086e81da7 (patch) | |
| tree | d806f4da3cc1988882c9802555eddb1b4dc08905 | |
| parent | 93aafb6d4f328aab0264863cf7b5faa3d0978a86 (diff) | |
crypto: testmgr - don't use stack buffer in test_acomp()
With virtually-mapped stacks (CONFIG_VMAP_STACK=y), using the
scatterlist crypto API with stack buffers is not allowed, and with
appropriate debugging options will cause the
'BUG_ON(!virt_addr_valid(buf));' in sg_set_buf() to be triggered.
Use a heap buffer instead.
Fixes: d7db7a882deb ("crypto: acomp - update testmgr with support for acomp")
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
| -rw-r--r-- | crypto/testmgr.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/crypto/testmgr.c b/crypto/testmgr.c index 6ac46966800b..67e68c0f9e61 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c @@ -1448,17 +1448,21 @@ static int test_acomp(struct crypto_acomp *tfm, struct comp_testvec *ctemplate,  {  	const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));  	unsigned int i; -	char output[COMP_BUF_SIZE]; +	char *output;  	int ret;  	struct scatterlist src, dst;  	struct acomp_req *req;  	struct tcrypt_result result; +	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL); +	if (!output) +		return -ENOMEM; +  	for (i = 0; i < ctcount; i++) {  		unsigned int dlen = COMP_BUF_SIZE;  		int ilen = ctemplate[i].inlen; -		memset(output, 0, sizeof(output)); +		memset(output, 0, dlen);  		init_completion(&result.completion);  		sg_init_one(&src, ctemplate[i].input, ilen);  		sg_init_one(&dst, output, dlen); @@ -1507,7 +1511,7 @@ static int test_acomp(struct crypto_acomp *tfm, struct comp_testvec *ctemplate,  		unsigned int dlen = COMP_BUF_SIZE;  		int ilen = dtemplate[i].inlen; -		memset(output, 0, sizeof(output)); +		memset(output, 0, dlen);  		init_completion(&result.completion);  		sg_init_one(&src, dtemplate[i].input, ilen);  		sg_init_one(&dst, output, dlen); @@ -1555,6 +1559,7 @@ static int test_acomp(struct crypto_acomp *tfm, struct comp_testvec *ctemplate,  	ret = 0;  out: +	kfree(output);  	return ret;  }  | 
