forked from mirrors/linux
		
	evm: Don't deadlock if a crypto algorithm is unavailable
When EVM attempts to appraise a file signed with a crypto algorithm the kernel doesn't have support for, it will cause the kernel to trigger a module load. If the EVM policy includes appraisal of kernel modules this will in turn call back into EVM - since EVM is holding a lock until the crypto initialisation is complete, this triggers a deadlock. Add a CRYPTO_NOLOAD flag and skip module loading if it's set, and add that flag in the EVM case in order to fail gracefully with an error message instead of deadlocking. Signed-off-by: Matthew Garrett <mjg59@google.com> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									ac2409a521
								
							
						
					
					
						commit
						e2861fa716
					
				
					 3 changed files with 8 additions and 2 deletions
				
			
		|  | @ -229,7 +229,7 @@ static struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, | |||
| 	mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD); | ||||
| 
 | ||||
| 	alg = crypto_alg_lookup(name, type, mask); | ||||
| 	if (!alg) { | ||||
| 	if (!alg && !(mask & CRYPTO_NOLOAD)) { | ||||
| 		request_module("crypto-%s", name); | ||||
| 
 | ||||
| 		if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask & | ||||
|  |  | |||
|  | @ -112,6 +112,11 @@ | |||
|  */ | ||||
| #define CRYPTO_ALG_OPTIONAL_KEY		0x00004000 | ||||
| 
 | ||||
| /*
 | ||||
|  * Don't trigger module loading | ||||
|  */ | ||||
| #define CRYPTO_NOLOAD			0x00008000 | ||||
| 
 | ||||
| /*
 | ||||
|  * Transform masks and values (for crt_flags). | ||||
|  */ | ||||
|  |  | |||
|  | @ -97,7 +97,8 @@ static struct shash_desc *init_desc(char type) | |||
| 		mutex_lock(&mutex); | ||||
| 		if (*tfm) | ||||
| 			goto out; | ||||
| 		*tfm = crypto_alloc_shash(algo, 0, CRYPTO_ALG_ASYNC); | ||||
| 		*tfm = crypto_alloc_shash(algo, 0, | ||||
| 					  CRYPTO_ALG_ASYNC | CRYPTO_NOLOAD); | ||||
| 		if (IS_ERR(*tfm)) { | ||||
| 			rc = PTR_ERR(*tfm); | ||||
| 			pr_err("Can not allocate %s (reason: %ld)\n", algo, rc); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Matthew Garrett
						Matthew Garrett