mirror of https://github.com/openssl/openssl.git
				
				
				
			Now that we have ERR_unload_strings(), ERR_load_ERR_strings() must
always load its strings because they might have been unloaded since the 'init' flag was deleted. But build_SYS_str_reasons() can use an 'init' flag.
This commit is contained in:
		
							parent
							
								
									567fef894e
								
							
						
					
					
						commit
						cf5bfbfc21
					
				|  | @ -56,7 +56,7 @@ | |||
|  * [including the GNU Public Licence.] | ||||
|  */ | ||||
| /* ====================================================================
 | ||||
|  * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved. | ||||
|  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  | @ -119,6 +119,8 @@ | |||
| #include <openssl/bio.h> | ||||
| #include <openssl/err.h> | ||||
| 
 | ||||
| static void err_load_strings(int lib, ERR_STRING_DATA *str); | ||||
| 
 | ||||
| static void ERR_STATE_free(ERR_STATE *s); | ||||
| #ifndef OPENSSL_NO_ERR | ||||
| static ERR_STRING_DATA ERR_str_libraries[]= | ||||
|  | @ -275,8 +277,10 @@ static int int_err_library_number=ERR_LIB_USER; | |||
|  * the defaults. */ | ||||
| static void err_fns_check(void) | ||||
| 	{ | ||||
| 	if (err_fns) return; | ||||
| 	 | ||||
| 	CRYPTO_w_lock(CRYPTO_LOCK_ERR); | ||||
| 	if(!err_fns) | ||||
| 	if (!err_fns) | ||||
| 		err_fns = &err_defaults; | ||||
| 	CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | ||||
| 	} | ||||
|  | @ -482,6 +486,9 @@ static void build_SYS_str_reasons() | |||
| 	/* OPENSSL_malloc cannot be used here, use static storage instead */ | ||||
| 	static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON]; | ||||
| 	int i; | ||||
| 	static int init = 1; | ||||
| 
 | ||||
| 	if (!init) return; | ||||
| 
 | ||||
| 	CRYPTO_w_lock(CRYPTO_LOCK_ERR_HASH); | ||||
| 
 | ||||
|  | @ -508,6 +515,8 @@ static void build_SYS_str_reasons() | |||
| 	/* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL},
 | ||||
| 	 * as required by ERR_load_strings. */ | ||||
| 
 | ||||
| 	init = 0; | ||||
| 	 | ||||
| 	CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH); | ||||
| 	} | ||||
| #endif | ||||
|  | @ -537,31 +546,18 @@ static void ERR_STATE_free(ERR_STATE *s) | |||
| 
 | ||||
| void ERR_load_ERR_strings(void) | ||||
| 	{ | ||||
| 	static int init=1; | ||||
| 
 | ||||
| 	if (init) | ||||
| 		{ | ||||
| 		init=0; | ||||
| 		/* We put the first-time check code here to reduce the number of
 | ||||
| 		 * times it is called (then it doesn't get called from | ||||
| 		 * ERR_load_strings() loads of times). */ | ||||
| 	err_fns_check(); | ||||
| #ifndef OPENSSL_NO_ERR | ||||
| 		ERR_load_strings(0,ERR_str_libraries); | ||||
| 		ERR_load_strings(0,ERR_str_reasons); | ||||
| 		ERR_load_strings(ERR_LIB_SYS,ERR_str_functs); | ||||
| 	err_load_strings(0,ERR_str_libraries); | ||||
| 	err_load_strings(0,ERR_str_reasons); | ||||
| 	err_load_strings(ERR_LIB_SYS,ERR_str_functs); | ||||
| 	build_SYS_str_reasons(); | ||||
| 		ERR_load_strings(ERR_LIB_SYS,SYS_str_reasons); | ||||
| 	err_load_strings(ERR_LIB_SYS,SYS_str_reasons); | ||||
| #endif | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| void ERR_load_strings(int lib, ERR_STRING_DATA *str) | ||||
| static void err_load_strings(int lib, ERR_STRING_DATA *str) | ||||
| 	{ | ||||
| 	/* Do this if it hasn't been done already (NB: The order of the "init=0"
 | ||||
| 	 * statement and the recursive calls back to this function prevent a | ||||
| 	 * loop). */ | ||||
| 	ERR_load_ERR_strings(); | ||||
| 	while (str->error) | ||||
| 		{ | ||||
| 		str->error|=ERR_PACK(lib,0,0); | ||||
|  | @ -570,6 +566,12 @@ void ERR_load_strings(int lib, ERR_STRING_DATA *str) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| void ERR_load_strings(int lib, ERR_STRING_DATA *str) | ||||
| 	{ | ||||
| 	err_load_ERR_strings(); | ||||
| 	err_load_strings(lib, str); | ||||
| 	} | ||||
| 
 | ||||
| void ERR_unload_strings(int lib, ERR_STRING_DATA *str) | ||||
| 	{ | ||||
| 	while(str->error) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue