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); | 	mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD); | ||||||
| 
 | 
 | ||||||
| 	alg = crypto_alg_lookup(name, type, mask); | 	alg = crypto_alg_lookup(name, type, mask); | ||||||
| 	if (!alg) { | 	if (!alg && !(mask & CRYPTO_NOLOAD)) { | ||||||
| 		request_module("crypto-%s", name); | 		request_module("crypto-%s", name); | ||||||
| 
 | 
 | ||||||
| 		if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask & | 		if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask & | ||||||
|  |  | ||||||
|  | @ -112,6 +112,11 @@ | ||||||
|  */ |  */ | ||||||
| #define CRYPTO_ALG_OPTIONAL_KEY		0x00004000 | #define CRYPTO_ALG_OPTIONAL_KEY		0x00004000 | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Don't trigger module loading | ||||||
|  |  */ | ||||||
|  | #define CRYPTO_NOLOAD			0x00008000 | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Transform masks and values (for crt_flags). |  * Transform masks and values (for crt_flags). | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -97,7 +97,8 @@ static struct shash_desc *init_desc(char type) | ||||||
| 		mutex_lock(&mutex); | 		mutex_lock(&mutex); | ||||||
| 		if (*tfm) | 		if (*tfm) | ||||||
| 			goto out; | 			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)) { | 		if (IS_ERR(*tfm)) { | ||||||
| 			rc = PTR_ERR(*tfm); | 			rc = PTR_ERR(*tfm); | ||||||
| 			pr_err("Can not allocate %s (reason: %ld)\n", algo, rc); | 			pr_err("Can not allocate %s (reason: %ld)\n", algo, rc); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Matthew Garrett
						Matthew Garrett