forked from mirrors/linux
		
	crypto: api - Fix module load deadlock with fallback algorithms
With the mandatory algorithm testing at registration, we have now created a deadlock with algorithms requiring fallbacks. This can happen if the module containing the algorithm requiring fallback is loaded first, without the fallback module being loaded first. The system will then try to test the new algorithm, find that it needs to load a fallback, and then try to load that. As both algorithms share the same module alias, it can attempt to load the original algorithm again and block indefinitely. As algorithms requiring fallbacks are a special case, we can fix this by giving them a different module alias than the rest. Then it's just a matter of using the right aliases according to what algorithms we're trying to find. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
		
							parent
							
								
									bb402f16ec
								
							
						
					
					
						commit
						a760a6656e
					
				
					 4 changed files with 17 additions and 6 deletions
				
			
		|  | @ -556,7 +556,7 @@ static void __exit aes_s390_fini(void) | |||
| module_init(aes_s390_init); | ||||
| module_exit(aes_s390_fini); | ||||
| 
 | ||||
| MODULE_ALIAS("aes"); | ||||
| MODULE_ALIAS("aes-all"); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  |  | |||
							
								
								
									
										15
									
								
								crypto/api.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								crypto/api.c
									
									
									
									
									
								
							|  | @ -215,8 +215,19 @@ struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask) | |||
| 	mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD); | ||||
| 	type &= mask; | ||||
| 
 | ||||
| 	alg = try_then_request_module(crypto_alg_lookup(name, type, mask), | ||||
| 				      name); | ||||
| 	alg = crypto_alg_lookup(name, type, mask); | ||||
| 	if (!alg) { | ||||
| 		char tmp[CRYPTO_MAX_ALG_NAME]; | ||||
| 
 | ||||
| 		request_module(name); | ||||
| 
 | ||||
| 		if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask) && | ||||
| 		    snprintf(tmp, sizeof(tmp), "%s-all", name) < sizeof(tmp)) | ||||
| 			request_module(tmp); | ||||
| 
 | ||||
| 		alg = crypto_alg_lookup(name, type, mask); | ||||
| 	} | ||||
| 
 | ||||
| 	if (alg) | ||||
| 		return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; | ||||
| 
 | ||||
|  |  | |||
|  | @ -489,4 +489,4 @@ MODULE_DESCRIPTION("VIA PadLock AES algorithm support"); | |||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("Michal Ludvig"); | ||||
| 
 | ||||
| MODULE_ALIAS("aes"); | ||||
| MODULE_ALIAS("aes-all"); | ||||
|  |  | |||
|  | @ -304,7 +304,7 @@ MODULE_DESCRIPTION("VIA PadLock SHA1/SHA256 algorithms support."); | |||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("Michal Ludvig"); | ||||
| 
 | ||||
| MODULE_ALIAS("sha1"); | ||||
| MODULE_ALIAS("sha256"); | ||||
| MODULE_ALIAS("sha1-all"); | ||||
| MODULE_ALIAS("sha256-all"); | ||||
| MODULE_ALIAS("sha1-padlock"); | ||||
| MODULE_ALIAS("sha256-padlock"); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Herbert Xu
						Herbert Xu