Totally get rid of CRYPTO_LOCK_ERR_HASH.
In err.c, flags int_error_hash_set and int_thread_hash_set appear superfluous since we can just as well initialize int_error_hash and int_thread_hash to NULL. Change some of the err.c formatting to conform with the rest of OpenSSL.
This commit is contained in:
parent
978ebf0141
commit
78f7923580
@ -74,7 +74,7 @@ static const char* lock_names[CRYPTO_NUM_LOCKS] =
|
|||||||
{
|
{
|
||||||
"<<ERROR>>",
|
"<<ERROR>>",
|
||||||
"err",
|
"err",
|
||||||
"err_hash",
|
"ex_data",
|
||||||
"x509",
|
"x509",
|
||||||
"x509_info",
|
"x509_info",
|
||||||
"x509_pkey",
|
"x509_pkey",
|
||||||
@ -103,8 +103,7 @@ static const char* lock_names[CRYPTO_NUM_LOCKS] =
|
|||||||
"dynlock",
|
"dynlock",
|
||||||
"engine",
|
"engine",
|
||||||
"ui",
|
"ui",
|
||||||
"ex_data",
|
#if CRYPTO_NUM_LOCKS != 31
|
||||||
#if CRYPTO_NUM_LOCKS != 32
|
|
||||||
# error "Inconsistency between crypto.h and cryptlib.c"
|
# error "Inconsistency between crypto.h and cryptlib.c"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -97,7 +97,7 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define CRYPTO_LOCK_ERR 1
|
#define CRYPTO_LOCK_ERR 1
|
||||||
#define CRYPTO_LOCK_ERR_HASH 2
|
#define CRYPTO_LOCK_EX_DATA 2
|
||||||
#define CRYPTO_LOCK_X509 3
|
#define CRYPTO_LOCK_X509 3
|
||||||
#define CRYPTO_LOCK_X509_INFO 4
|
#define CRYPTO_LOCK_X509_INFO 4
|
||||||
#define CRYPTO_LOCK_X509_PKEY 5
|
#define CRYPTO_LOCK_X509_PKEY 5
|
||||||
@ -126,8 +126,7 @@ extern "C" {
|
|||||||
#define CRYPTO_LOCK_DYNLOCK 28
|
#define CRYPTO_LOCK_DYNLOCK 28
|
||||||
#define CRYPTO_LOCK_ENGINE 29
|
#define CRYPTO_LOCK_ENGINE 29
|
||||||
#define CRYPTO_LOCK_UI 30
|
#define CRYPTO_LOCK_UI 30
|
||||||
#define CRYPTO_LOCK_EX_DATA 31
|
#define CRYPTO_NUM_LOCKS 31
|
||||||
#define CRYPTO_NUM_LOCKS 32
|
|
||||||
|
|
||||||
#define CRYPTO_LOCK 1
|
#define CRYPTO_LOCK 1
|
||||||
#define CRYPTO_UNLOCK 2
|
#define CRYPTO_UNLOCK 2
|
||||||
|
122
crypto/err/err.c
122
crypto/err/err.c
@ -267,11 +267,9 @@ static const ERR_FNS *err_fns = NULL;
|
|||||||
* "err_defaults" functions. This way, a linked module can completely defer all
|
* "err_defaults" functions. This way, a linked module can completely defer all
|
||||||
* ERR state operation (together with requisite locking) to the implementations
|
* ERR state operation (together with requisite locking) to the implementations
|
||||||
* and state in the loading application. */
|
* and state in the loading application. */
|
||||||
static LHASH *int_error_hash;
|
static LHASH *int_error_hash = NULL;
|
||||||
static int int_error_hash_set = 0;
|
static LHASH *int_thread_hash = NULL;
|
||||||
static LHASH *int_thread_hash;
|
static int int_err_library_number= ERR_LIB_USER;
|
||||||
static int int_thread_hash_set = 0;
|
|
||||||
static int int_err_library_number=ERR_LIB_USER;
|
|
||||||
|
|
||||||
/* Internal function that checks whether "err_fns" is set and if not, sets it to
|
/* Internal function that checks whether "err_fns" is set and if not, sets it to
|
||||||
* the defaults. */
|
* the defaults. */
|
||||||
@ -295,17 +293,18 @@ const ERR_FNS *ERR_get_implementation(void)
|
|||||||
|
|
||||||
int ERR_set_implementation(const ERR_FNS *fns)
|
int ERR_set_implementation(const ERR_FNS *fns)
|
||||||
{
|
{
|
||||||
int toret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
/* It's too late if 'err_fns' is non-NULL. BTW: not much point setting
|
/* It's too late if 'err_fns' is non-NULL. BTW: not much point setting
|
||||||
* an error is there?! */
|
* an error is there?! */
|
||||||
if(!err_fns)
|
if (!err_fns)
|
||||||
{
|
{
|
||||||
err_fns = fns;
|
err_fns = fns;
|
||||||
toret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
return toret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* These are the callbacks provided to "lh_new()" when creating the LHASH tables
|
/* These are the callbacks provided to "lh_new()" when creating the LHASH tables
|
||||||
@ -326,27 +325,25 @@ static unsigned long get_error_values(int inc,const char **file,int *line,
|
|||||||
|
|
||||||
static LHASH *int_err_get(void)
|
static LHASH *int_err_get(void)
|
||||||
{
|
{
|
||||||
LHASH *toret = NULL;
|
LHASH *ret = NULL;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
if(!int_error_hash_set)
|
if (!int_error_hash)
|
||||||
int_error_hash = lh_new(err_hash, err_cmp);
|
int_error_hash = lh_new(err_hash, err_cmp);
|
||||||
if(int_error_hash)
|
if (int_error_hash)
|
||||||
{
|
ret = int_error_hash;
|
||||||
int_error_hash_set = 1;
|
|
||||||
toret = int_error_hash;
|
|
||||||
}
|
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
return(toret);
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void int_err_del(void)
|
static void int_err_del(void)
|
||||||
{
|
{
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
if(int_error_hash_set)
|
if (int_error_hash)
|
||||||
{
|
{
|
||||||
lh_free(int_error_hash);
|
lh_free(int_error_hash);
|
||||||
int_error_hash = NULL;
|
int_error_hash = NULL;
|
||||||
int_error_hash_set = 0;
|
|
||||||
}
|
}
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
}
|
}
|
||||||
@ -355,13 +352,16 @@ static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *d)
|
|||||||
{
|
{
|
||||||
ERR_STRING_DATA *p;
|
ERR_STRING_DATA *p;
|
||||||
LHASH *hash;
|
LHASH *hash;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
hash = ERRFN(err_get)();
|
hash = ERRFN(err_get)();
|
||||||
if(!hash)
|
if (!hash)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
CRYPTO_r_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_r_lock(CRYPTO_LOCK_ERR);
|
||||||
p = (ERR_STRING_DATA *)lh_retrieve(hash, d);
|
p = (ERR_STRING_DATA *)lh_retrieve(hash, d);
|
||||||
CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,13 +369,16 @@ static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *d)
|
|||||||
{
|
{
|
||||||
ERR_STRING_DATA *p;
|
ERR_STRING_DATA *p;
|
||||||
LHASH *hash;
|
LHASH *hash;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
hash = ERRFN(err_get)();
|
hash = ERRFN(err_get)();
|
||||||
if(!hash)
|
if (!hash)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
p = (ERR_STRING_DATA *)lh_insert(hash, d);
|
p = (ERR_STRING_DATA *)lh_insert(hash, d);
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,42 +386,46 @@ static ERR_STRING_DATA *int_err_del_item(ERR_STRING_DATA *d)
|
|||||||
{
|
{
|
||||||
ERR_STRING_DATA *p;
|
ERR_STRING_DATA *p;
|
||||||
LHASH *hash;
|
LHASH *hash;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
hash = ERRFN(err_get)();
|
hash = ERRFN(err_get)();
|
||||||
if(!hash)
|
if (!hash)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
p = (ERR_STRING_DATA *)lh_delete(hash, d);
|
p = (ERR_STRING_DATA *)lh_delete(hash, d);
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static LHASH *int_thread_get(void)
|
static LHASH *int_thread_get(void)
|
||||||
{
|
{
|
||||||
LHASH *toret = NULL;
|
LHASH *ret = NULL;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
if(!int_thread_hash_set)
|
if (!int_thread_hash)
|
||||||
int_thread_hash = lh_new(pid_hash, pid_cmp);
|
int_thread_hash = lh_new(pid_hash, pid_cmp);
|
||||||
if(int_thread_hash)
|
if (int_thread_hash)
|
||||||
{
|
ret = int_thread_hash;
|
||||||
int_thread_hash_set = 1;
|
|
||||||
toret = int_thread_hash;
|
|
||||||
}
|
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
return(toret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ERR_STATE *int_thread_get_item(const ERR_STATE *d)
|
static ERR_STATE *int_thread_get_item(const ERR_STATE *d)
|
||||||
{
|
{
|
||||||
ERR_STATE *p;
|
ERR_STATE *p;
|
||||||
LHASH *hash;
|
LHASH *hash;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
hash = ERRFN(thread_get)();
|
hash = ERRFN(thread_get)();
|
||||||
if(!hash)
|
if (!hash)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
CRYPTO_r_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_r_lock(CRYPTO_LOCK_ERR);
|
||||||
p = (ERR_STATE *)lh_retrieve(hash, d);
|
p = (ERR_STATE *)lh_retrieve(hash, d);
|
||||||
CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,13 +433,16 @@ static ERR_STATE *int_thread_set_item(ERR_STATE *d)
|
|||||||
{
|
{
|
||||||
ERR_STATE *p;
|
ERR_STATE *p;
|
||||||
LHASH *hash;
|
LHASH *hash;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
hash = ERRFN(thread_get)();
|
hash = ERRFN(thread_get)();
|
||||||
if(!hash)
|
if (!hash)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
p = (ERR_STATE *)lh_insert(hash, d);
|
p = (ERR_STATE *)lh_insert(hash, d);
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,31 +450,35 @@ static void int_thread_del_item(const ERR_STATE *d)
|
|||||||
{
|
{
|
||||||
ERR_STATE *p;
|
ERR_STATE *p;
|
||||||
LHASH *hash;
|
LHASH *hash;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
hash = ERRFN(thread_get)();
|
hash = ERRFN(thread_get)();
|
||||||
if(!hash)
|
if (!hash)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
p = (ERR_STATE *)lh_delete(hash, d);
|
p = (ERR_STATE *)lh_delete(hash, d);
|
||||||
/* make sure we don't leak memory */
|
/* make sure we don't leak memory */
|
||||||
if(int_thread_hash_set && (lh_num_items(int_thread_hash) == 0))
|
if (int_thread_hash && (lh_num_items(int_thread_hash) == 0))
|
||||||
{
|
{
|
||||||
lh_free(int_thread_hash);
|
lh_free(int_thread_hash);
|
||||||
int_thread_hash = NULL;
|
int_thread_hash = NULL;
|
||||||
int_thread_hash_set = 0;
|
|
||||||
}
|
}
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
if(p)
|
|
||||||
|
if (p)
|
||||||
ERR_STATE_free(p);
|
ERR_STATE_free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int int_err_get_next_lib(void)
|
static int int_err_get_next_lib(void)
|
||||||
{
|
{
|
||||||
int toret;
|
int ret;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
toret = int_err_library_number++;
|
ret = int_err_library_number++;
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
return toret;
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -490,7 +504,7 @@ static void build_SYS_str_reasons()
|
|||||||
|
|
||||||
if (!init) return;
|
if (!init) return;
|
||||||
|
|
||||||
CRYPTO_w_lock(CRYPTO_LOCK_ERR_HASH);
|
CRYPTO_w_lock(CRYPTO_LOCK_ERR);
|
||||||
|
|
||||||
for (i = 1; i <= NUM_SYS_STR_REASONS; i++)
|
for (i = 1; i <= NUM_SYS_STR_REASONS; i++)
|
||||||
{
|
{
|
||||||
@ -517,7 +531,7 @@ static void build_SYS_str_reasons()
|
|||||||
|
|
||||||
init = 0;
|
init = 0;
|
||||||
|
|
||||||
CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH);
|
CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -534,7 +548,7 @@ static void ERR_STATE_free(ERR_STATE *s)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(s == NULL)
|
if (s == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i=0; i<ERR_NUM_ERRORS; i++)
|
for (i=0; i<ERR_NUM_ERRORS; i++)
|
||||||
@ -574,7 +588,7 @@ void ERR_load_strings(int lib, ERR_STRING_DATA *str)
|
|||||||
|
|
||||||
void ERR_unload_strings(int lib, ERR_STRING_DATA *str)
|
void ERR_unload_strings(int lib, ERR_STRING_DATA *str)
|
||||||
{
|
{
|
||||||
while(str->error)
|
while (str->error)
|
||||||
{
|
{
|
||||||
str->error|=ERR_PACK(lib,0,0);
|
str->error|=ERR_PACK(lib,0,0);
|
||||||
ERRFN(err_del_item)(str);
|
ERRFN(err_del_item)(str);
|
||||||
@ -652,8 +666,7 @@ unsigned long ERR_get_error_line(const char **file,
|
|||||||
|
|
||||||
unsigned long ERR_get_error_line_data(const char **file, int *line,
|
unsigned long ERR_get_error_line_data(const char **file, int *line,
|
||||||
const char **data, int *flags)
|
const char **data, int *flags)
|
||||||
{ return(get_error_values(1,file,line,
|
{ return(get_error_values(1,file,line,data,flags)); }
|
||||||
data,flags)); }
|
|
||||||
|
|
||||||
unsigned long ERR_peek_error(void)
|
unsigned long ERR_peek_error(void)
|
||||||
{ return(get_error_values(0,NULL,NULL,NULL,NULL)); }
|
{ return(get_error_values(0,NULL,NULL,NULL,NULL)); }
|
||||||
@ -664,8 +677,7 @@ unsigned long ERR_peek_error_line(const char **file,
|
|||||||
|
|
||||||
unsigned long ERR_peek_error_line_data(const char **file, int *line,
|
unsigned long ERR_peek_error_line_data(const char **file, int *line,
|
||||||
const char **data, int *flags)
|
const char **data, int *flags)
|
||||||
{ return(get_error_values(0,file,line,
|
{ return(get_error_values(0,file,line,data,flags)); }
|
||||||
data,flags)); }
|
|
||||||
|
|
||||||
static unsigned long get_error_values(int inc, const char **file, int *line,
|
static unsigned long get_error_values(int inc, const char **file, int *line,
|
||||||
const char **data, int *flags)
|
const char **data, int *flags)
|
||||||
@ -676,7 +688,7 @@ static unsigned long get_error_values(int inc, const char **file, int *line,
|
|||||||
|
|
||||||
es=ERR_get_state();
|
es=ERR_get_state();
|
||||||
|
|
||||||
if (es->bottom == es->top) return(0);
|
if (es->bottom == es->top) return 0;
|
||||||
i=(es->bottom+1)%ERR_NUM_ERRORS;
|
i=(es->bottom+1)%ERR_NUM_ERRORS;
|
||||||
|
|
||||||
ret=es->err_buffer[i];
|
ret=es->err_buffer[i];
|
||||||
@ -720,7 +732,7 @@ static unsigned long get_error_values(int inc, const char **file, int *line,
|
|||||||
if (flags != NULL) *flags=es->err_data_flags[i];
|
if (flags != NULL) *flags=es->err_data_flags[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ERR_error_string_n(unsigned long e, char *buf, size_t len)
|
void ERR_error_string_n(unsigned long e, char *buf, size_t len)
|
||||||
@ -782,7 +794,7 @@ char *ERR_error_string(unsigned long e, char *ret)
|
|||||||
if (ret == NULL) ret=buf;
|
if (ret == NULL) ret=buf;
|
||||||
ERR_error_string_n(e, ret, 256);
|
ERR_error_string_n(e, ret, 256);
|
||||||
|
|
||||||
return(ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
LHASH *ERR_get_string_table(void)
|
LHASH *ERR_get_string_table(void)
|
||||||
@ -832,7 +844,7 @@ const char *ERR_reason_error_string(unsigned long e)
|
|||||||
r=ERR_GET_REASON(e);
|
r=ERR_GET_REASON(e);
|
||||||
d.error=ERR_PACK(l,0,r);
|
d.error=ERR_PACK(l,0,r);
|
||||||
p=ERRFN(err_get_item)(&d);
|
p=ERRFN(err_get_item)(&d);
|
||||||
if(!p)
|
if (!p)
|
||||||
{
|
{
|
||||||
d.error=ERR_PACK(0,0,r);
|
d.error=ERR_PACK(0,0,r);
|
||||||
p=ERRFN(err_get_item)(&d);
|
p=ERRFN(err_get_item)(&d);
|
||||||
@ -873,6 +885,7 @@ static int pid_cmp(const void *a_void, const void *b_void)
|
|||||||
void ERR_remove_state(unsigned long pid)
|
void ERR_remove_state(unsigned long pid)
|
||||||
{
|
{
|
||||||
ERR_STATE tmp;
|
ERR_STATE tmp;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
pid=(unsigned long)CRYPTO_thread_id();
|
pid=(unsigned long)CRYPTO_thread_id();
|
||||||
@ -888,6 +901,7 @@ ERR_STATE *ERR_get_state(void)
|
|||||||
ERR_STATE *ret,tmp,*tmpp=NULL;
|
ERR_STATE *ret,tmp,*tmpp=NULL;
|
||||||
int i;
|
int i;
|
||||||
unsigned long pid;
|
unsigned long pid;
|
||||||
|
|
||||||
err_fns_check();
|
err_fns_check();
|
||||||
pid=(unsigned long)CRYPTO_thread_id();
|
pid=(unsigned long)CRYPTO_thread_id();
|
||||||
tmp.pid=pid;
|
tmp.pid=pid;
|
||||||
@ -908,17 +922,17 @@ ERR_STATE *ERR_get_state(void)
|
|||||||
}
|
}
|
||||||
tmpp = ERRFN(thread_set_item)(ret);
|
tmpp = ERRFN(thread_set_item)(ret);
|
||||||
/* To check if insertion failed, do a get. */
|
/* To check if insertion failed, do a get. */
|
||||||
if(ERRFN(thread_get_item)(ret) != ret)
|
if (ERRFN(thread_get_item)(ret) != ret)
|
||||||
{
|
{
|
||||||
ERR_STATE_free(ret); /* could not insert it */
|
ERR_STATE_free(ret); /* could not insert it */
|
||||||
return(&fallback);
|
return(&fallback);
|
||||||
}
|
}
|
||||||
/* If a race occured in this function and we came second, tmpp
|
/* If a race occured in this function and we came second, tmpp
|
||||||
* is the first one that we just replaced. */
|
* is the first one that we just replaced. */
|
||||||
if(tmpp)
|
if (tmpp)
|
||||||
ERR_STATE_free(tmpp);
|
ERR_STATE_free(tmpp);
|
||||||
}
|
}
|
||||||
return(ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ERR_get_next_error_library(void)
|
int ERR_get_next_error_library(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user