summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2024-10-02 14:54:26 +0000
committerjsing <>2024-10-02 14:54:26 +0000
commitd496a691ad7804a7d3cace89ff92a9b88b8bb653 (patch)
treea2f89593699a230c8e0a65657c98a8435ecfdc63 /src
parent995c61007f2252e2f96eb7e6b8862f523464dedc (diff)
downloadopenbsd-d496a691ad7804a7d3cace89ff92a9b88b8bb653.tar.gz
openbsd-d496a691ad7804a7d3cace89ff92a9b88b8bb653.tar.bz2
openbsd-d496a691ad7804a7d3cace89ff92a9b88b8bb653.zip
Remove err_fns and associated machinery.
Like all good OpenSSL code, errors was built to be completely extensible. Thankfully, the ERR_{get,set}_implementation() functions were removed in r1.127 of err.c, which means that the extensibility can no longer be used. Take the first of many steps to clean up this code - remove err_fns and associated machinery, calling functions directly. Rename so that we have an 'err_' prefix rather than 'int_' (or nothing). ok joshua@ tb@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/err/err.c207
1 files changed, 65 insertions, 142 deletions
diff --git a/src/lib/libcrypto/err/err.c b/src/lib/libcrypto/err/err.c
index d8ad4f8bab..3babdb3211 100644
--- a/src/lib/libcrypto/err/err.c
+++ b/src/lib/libcrypto/err/err.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: err.c,v 1.63 2024/08/31 10:09:15 tb Exp $ */ 1/* $OpenBSD: err.c,v 1.64 2024/10/02 14:54:26 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -238,87 +238,24 @@ static ERR_STRING_DATA ERR_str_reasons[] = {
238}; 238};
239#endif 239#endif
240 240
241 241/*
242/* Define the predeclared (but externally opaque) "ERR_FNS" type */ 242 * The internal state used by "err_defaults" - as such, the setting, reading,
243struct st_ERR_FNS {
244 /* Works on the "error_hash" string table */
245 LHASH_OF(ERR_STRING_DATA) *(*cb_err_get)(int create);
246 void (*cb_err_del)(void);
247 const ERR_STRING_DATA *(*cb_err_get_item)(const ERR_STRING_DATA *);
248 const ERR_STRING_DATA *(*cb_err_set_item)(const ERR_STRING_DATA *);
249 const ERR_STRING_DATA *(*cb_err_del_item)(const ERR_STRING_DATA *);
250 /* Works on the "thread_hash" error-state table */
251 LHASH_OF(ERR_STATE) *(*cb_thread_get)(int create);
252 void (*cb_thread_release)(LHASH_OF(ERR_STATE) **hash);
253 ERR_STATE *(*cb_thread_get_item)(const ERR_STATE *);
254 ERR_STATE *(*cb_thread_set_item)(ERR_STATE *);
255 void (*cb_thread_del_item)(const ERR_STATE *);
256 /* Returns the next available error "library" numbers */
257 int (*cb_get_next_lib)(void);
258};
259
260/* Predeclarations of the "err_defaults" functions */
261static LHASH_OF(ERR_STRING_DATA) *int_err_get(int create);
262static void int_err_del(void);
263static const ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *);
264static const ERR_STRING_DATA *int_err_set_item(const ERR_STRING_DATA *);
265static const ERR_STRING_DATA *int_err_del_item(const ERR_STRING_DATA *);
266static LHASH_OF(ERR_STATE) *int_thread_get(int create);
267static void int_thread_release(LHASH_OF(ERR_STATE) **hash);
268static ERR_STATE *int_thread_get_item(const ERR_STATE *);
269static ERR_STATE *int_thread_set_item(ERR_STATE *);
270static void int_thread_del_item(const ERR_STATE *);
271static int int_err_get_next_lib(void);
272
273/* The static ERR_FNS table using these defaults functions */
274static const ERR_FNS err_defaults = {
275 int_err_get,
276 int_err_del,
277 int_err_get_item,
278 int_err_set_item,
279 int_err_del_item,
280 int_thread_get,
281 int_thread_release,
282 int_thread_get_item,
283 int_thread_set_item,
284 int_thread_del_item,
285 int_err_get_next_lib
286};
287
288/* The replacable table of ERR_FNS functions we use at run-time */
289static const ERR_FNS *err_fns = NULL;
290
291/* Eg. rather than using "err_get()", use "ERRFN(err_get)()". */
292#define ERRFN(a) err_fns->cb_##a
293
294/* The internal state used by "err_defaults" - as such, the setting, reading,
295 * creating, and deleting of this data should only be permitted via the 243 * creating, and deleting of this data should only be permitted via the
296 * "err_defaults" functions. This way, a linked module can completely defer all 244 * "err_defaults" functions. This way, a linked module can completely defer all
297 * ERR state operation (together with requisite locking) to the implementations 245 * ERR state operation (together with requisite locking) to the implementations
298 * and state in the loading application. */ 246 * and state in the loading application.
299static LHASH_OF(ERR_STRING_DATA) *int_error_hash = NULL; 247 */
300static LHASH_OF(ERR_STATE) *int_thread_hash = NULL; 248static LHASH_OF(ERR_STRING_DATA) *err_error_hash = NULL;
301static int int_thread_hash_references = 0; 249static LHASH_OF(ERR_STATE) *err_thread_hash = NULL;
302static int int_err_library_number = ERR_LIB_USER; 250static int err_thread_hash_references = 0;
251static int err_library_number = ERR_LIB_USER;
303 252
304static pthread_t err_init_thread; 253static pthread_t err_init_thread;
305 254
306/* Internal function that checks whether "err_fns" is set and if not, sets it to 255/*
307 * the defaults. */ 256 * These are the callbacks provided to "lh_new()" when creating the LHASH tables
308static void 257 * internal to the "err_defaults" implementation.
309err_fns_check(void) 258 */
310{
311 if (err_fns)
312 return;
313
314 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
315 if (!err_fns)
316 err_fns = &err_defaults;
317 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
318}
319
320/* These are the callbacks provided to "lh_new()" when creating the LHASH tables
321 * internal to the "err_defaults" implementation. */
322 259
323static unsigned long get_error_values(int inc, int top, const char **file, 260static unsigned long get_error_values(int inc, int top, const char **file,
324 int *line, const char **data, int *flags); 261 int *line, const char **data, int *flags);
@@ -344,39 +281,38 @@ err_string_data_cmp(const ERR_STRING_DATA *a, const ERR_STRING_DATA *b)
344static IMPLEMENT_LHASH_COMP_FN(err_string_data, ERR_STRING_DATA) 281static IMPLEMENT_LHASH_COMP_FN(err_string_data, ERR_STRING_DATA)
345 282
346static LHASH_OF(ERR_STRING_DATA) * 283static LHASH_OF(ERR_STRING_DATA) *
347int_err_get(int create) 284err_get(int create)
348{ 285{
349 LHASH_OF(ERR_STRING_DATA) *ret = NULL; 286 LHASH_OF(ERR_STRING_DATA) *ret = NULL;
350 287
351 CRYPTO_w_lock(CRYPTO_LOCK_ERR); 288 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
352 if (!int_error_hash && create) 289 if (!err_error_hash && create)
353 int_error_hash = lh_ERR_STRING_DATA_new(); 290 err_error_hash = lh_ERR_STRING_DATA_new();
354 if (int_error_hash) 291 if (err_error_hash)
355 ret = int_error_hash; 292 ret = err_error_hash;
356 CRYPTO_w_unlock(CRYPTO_LOCK_ERR); 293 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
357 294
358 return ret; 295 return ret;
359} 296}
360 297
361static void 298static void
362int_err_del(void) 299err_del(void)
363{ 300{
364 CRYPTO_w_lock(CRYPTO_LOCK_ERR); 301 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
365 if (int_error_hash) { 302 if (err_error_hash) {
366 lh_ERR_STRING_DATA_free(int_error_hash); 303 lh_ERR_STRING_DATA_free(err_error_hash);
367 int_error_hash = NULL; 304 err_error_hash = NULL;
368 } 305 }
369 CRYPTO_w_unlock(CRYPTO_LOCK_ERR); 306 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
370} 307}
371 308
372static const ERR_STRING_DATA * 309static const ERR_STRING_DATA *
373int_err_get_item(const ERR_STRING_DATA *d) 310err_get_item(const ERR_STRING_DATA *d)
374{ 311{
375 ERR_STRING_DATA *p; 312 ERR_STRING_DATA *p;
376 LHASH_OF(ERR_STRING_DATA) *hash; 313 LHASH_OF(ERR_STRING_DATA) *hash;
377 314
378 err_fns_check(); 315 hash = err_get(0);
379 hash = ERRFN(err_get)(0);
380 if (!hash) 316 if (!hash)
381 return NULL; 317 return NULL;
382 318
@@ -388,13 +324,12 @@ int_err_get_item(const ERR_STRING_DATA *d)
388} 324}
389 325
390static const ERR_STRING_DATA * 326static const ERR_STRING_DATA *
391int_err_set_item(const ERR_STRING_DATA *d) 327err_set_item(const ERR_STRING_DATA *d)
392{ 328{
393 const ERR_STRING_DATA *p; 329 const ERR_STRING_DATA *p;
394 LHASH_OF(ERR_STRING_DATA) *hash; 330 LHASH_OF(ERR_STRING_DATA) *hash;
395 331
396 err_fns_check(); 332 hash = err_get(1);
397 hash = ERRFN(err_get)(1);
398 if (!hash) 333 if (!hash)
399 return NULL; 334 return NULL;
400 335
@@ -406,13 +341,12 @@ int_err_set_item(const ERR_STRING_DATA *d)
406} 341}
407 342
408static const ERR_STRING_DATA * 343static const ERR_STRING_DATA *
409int_err_del_item(const ERR_STRING_DATA *d) 344err_del_item(const ERR_STRING_DATA *d)
410{ 345{
411 ERR_STRING_DATA *p; 346 ERR_STRING_DATA *p;
412 LHASH_OF(ERR_STRING_DATA) *hash; 347 LHASH_OF(ERR_STRING_DATA) *hash;
413 348
414 err_fns_check(); 349 hash = err_get(0);
415 hash = ERRFN(err_get)(0);
416 if (!hash) 350 if (!hash)
417 return NULL; 351 return NULL;
418 352
@@ -438,30 +372,30 @@ err_state_cmp(const ERR_STATE *a, const ERR_STATE *b)
438static IMPLEMENT_LHASH_COMP_FN(err_state, ERR_STATE) 372static IMPLEMENT_LHASH_COMP_FN(err_state, ERR_STATE)
439 373
440static LHASH_OF(ERR_STATE) * 374static LHASH_OF(ERR_STATE) *
441int_thread_get(int create) 375err_thread_get(int create)
442{ 376{
443 LHASH_OF(ERR_STATE) *ret = NULL; 377 LHASH_OF(ERR_STATE) *ret = NULL;
444 378
445 CRYPTO_w_lock(CRYPTO_LOCK_ERR); 379 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
446 if (!int_thread_hash && create) 380 if (!err_thread_hash && create)
447 int_thread_hash = lh_ERR_STATE_new(); 381 err_thread_hash = lh_ERR_STATE_new();
448 if (int_thread_hash) { 382 if (err_thread_hash) {
449 int_thread_hash_references++; 383 err_thread_hash_references++;
450 ret = int_thread_hash; 384 ret = err_thread_hash;
451 } 385 }
452 CRYPTO_w_unlock(CRYPTO_LOCK_ERR); 386 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
453 return ret; 387 return ret;
454} 388}
455 389
456static void 390static void
457int_thread_release(LHASH_OF(ERR_STATE) **hash) 391err_thread_release(LHASH_OF(ERR_STATE) **hash)
458{ 392{
459 int i; 393 int i;
460 394
461 if (hash == NULL || *hash == NULL) 395 if (hash == NULL || *hash == NULL)
462 return; 396 return;
463 397
464 i = CRYPTO_add(&int_thread_hash_references, -1, CRYPTO_LOCK_ERR); 398 i = CRYPTO_add(&err_thread_hash_references, -1, CRYPTO_LOCK_ERR);
465 if (i > 0) 399 if (i > 0)
466 return; 400 return;
467 401
@@ -469,13 +403,12 @@ int_thread_release(LHASH_OF(ERR_STATE) **hash)
469} 403}
470 404
471static ERR_STATE * 405static ERR_STATE *
472int_thread_get_item(const ERR_STATE *d) 406err_thread_get_item(const ERR_STATE *d)
473{ 407{
474 ERR_STATE *p; 408 ERR_STATE *p;
475 LHASH_OF(ERR_STATE) *hash; 409 LHASH_OF(ERR_STATE) *hash;
476 410
477 err_fns_check(); 411 hash = err_thread_get(0);
478 hash = ERRFN(thread_get)(0);
479 if (!hash) 412 if (!hash)
480 return NULL; 413 return NULL;
481 414
@@ -483,18 +416,17 @@ int_thread_get_item(const ERR_STATE *d)
483 p = lh_ERR_STATE_retrieve(hash, d); 416 p = lh_ERR_STATE_retrieve(hash, d);
484 CRYPTO_r_unlock(CRYPTO_LOCK_ERR); 417 CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
485 418
486 ERRFN(thread_release)(&hash); 419 err_thread_release(&hash);
487 return p; 420 return p;
488} 421}
489 422
490static ERR_STATE * 423static ERR_STATE *
491int_thread_set_item(ERR_STATE *d) 424err_thread_set_item(ERR_STATE *d)
492{ 425{
493 ERR_STATE *p; 426 ERR_STATE *p;
494 LHASH_OF(ERR_STATE) *hash; 427 LHASH_OF(ERR_STATE) *hash;
495 428
496 err_fns_check(); 429 hash = err_thread_get(1);
497 hash = ERRFN(thread_get)(1);
498 if (!hash) 430 if (!hash)
499 return NULL; 431 return NULL;
500 432
@@ -502,43 +434,42 @@ int_thread_set_item(ERR_STATE *d)
502 p = lh_ERR_STATE_insert(hash, d); 434 p = lh_ERR_STATE_insert(hash, d);
503 CRYPTO_w_unlock(CRYPTO_LOCK_ERR); 435 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
504 436
505 ERRFN(thread_release)(&hash); 437 err_thread_release(&hash);
506 return p; 438 return p;
507} 439}
508 440
509static void 441static void
510int_thread_del_item(const ERR_STATE *d) 442err_thread_del_item(const ERR_STATE *d)
511{ 443{
512 ERR_STATE *p; 444 ERR_STATE *p;
513 LHASH_OF(ERR_STATE) *hash; 445 LHASH_OF(ERR_STATE) *hash;
514 446
515 err_fns_check(); 447 hash = err_thread_get(0);
516 hash = ERRFN(thread_get)(0);
517 if (!hash) 448 if (!hash)
518 return; 449 return;
519 450
520 CRYPTO_w_lock(CRYPTO_LOCK_ERR); 451 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
521 p = lh_ERR_STATE_delete(hash, d); 452 p = lh_ERR_STATE_delete(hash, d);
522 /* make sure we don't leak memory */ 453 /* make sure we don't leak memory */
523 if (int_thread_hash_references == 1 && 454 if (err_thread_hash_references == 1 &&
524 int_thread_hash && lh_ERR_STATE_num_items(int_thread_hash) == 0) { 455 err_thread_hash && lh_ERR_STATE_num_items(err_thread_hash) == 0) {
525 lh_ERR_STATE_free(int_thread_hash); 456 lh_ERR_STATE_free(err_thread_hash);
526 int_thread_hash = NULL; 457 err_thread_hash = NULL;
527 } 458 }
528 CRYPTO_w_unlock(CRYPTO_LOCK_ERR); 459 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
529 460
530 ERRFN(thread_release)(&hash); 461 err_thread_release(&hash);
531 if (p) 462 if (p)
532 ERR_STATE_free(p); 463 ERR_STATE_free(p);
533} 464}
534 465
535static int 466static int
536int_err_get_next_lib(void) 467err_get_next_lib(void)
537{ 468{
538 int ret; 469 int ret;
539 470
540 CRYPTO_w_lock(CRYPTO_LOCK_ERR); 471 CRYPTO_w_lock(CRYPTO_LOCK_ERR);
541 ret = int_err_library_number++; 472 ret = err_library_number++;
542 CRYPTO_w_unlock(CRYPTO_LOCK_ERR); 473 CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
543 474
544 return ret; 475 return ret;
@@ -647,7 +578,6 @@ void
647ERR_load_ERR_strings_internal(void) 578ERR_load_ERR_strings_internal(void)
648{ 579{
649 err_init_thread = pthread_self(); 580 err_init_thread = pthread_self();
650 err_fns_check();
651#ifndef OPENSSL_NO_ERR 581#ifndef OPENSSL_NO_ERR
652 err_load_strings(0, ERR_str_libraries); 582 err_load_strings(0, ERR_str_libraries);
653 err_load_strings(0, ERR_str_reasons); 583 err_load_strings(0, ERR_str_reasons);
@@ -679,7 +609,7 @@ err_load_strings(int lib, ERR_STRING_DATA *str)
679 while (str->error) { 609 while (str->error) {
680 if (lib) 610 if (lib)
681 str->error |= ERR_PACK(lib, 0, 0); 611 str->error |= ERR_PACK(lib, 0, 0);
682 ERRFN(err_set_item)(str); 612 err_set_item(str);
683 str++; 613 str++;
684 } 614 }
685} 615}
@@ -697,7 +627,7 @@ ERR_load_const_strings(const ERR_STRING_DATA *str)
697{ 627{
698 ERR_load_ERR_strings(); 628 ERR_load_ERR_strings();
699 while (str->error) { 629 while (str->error) {
700 ERRFN(err_set_item)(str); 630 err_set_item(str);
701 str++; 631 str++;
702 } 632 }
703} 633}
@@ -711,7 +641,7 @@ ERR_unload_strings(int lib, ERR_STRING_DATA *str)
711 while (str->error) { 641 while (str->error) {
712 if (lib) 642 if (lib)
713 str->error |= ERR_PACK(lib, 0, 0); 643 str->error |= ERR_PACK(lib, 0, 0);
714 ERRFN(err_del_item)(str); 644 err_del_item(str);
715 str++; 645 str++;
716 } 646 }
717} 647}
@@ -723,8 +653,7 @@ ERR_free_strings(void)
723 /* Prayer and clean living lets you ignore errors, OpenSSL style */ 653 /* Prayer and clean living lets you ignore errors, OpenSSL style */
724 (void) OPENSSL_init_crypto(0, NULL); 654 (void) OPENSSL_init_crypto(0, NULL);
725 655
726 err_fns_check(); 656 err_del();
727 ERRFN(err_del)();
728} 657}
729LCRYPTO_ALIAS(ERR_free_strings); 658LCRYPTO_ALIAS(ERR_free_strings);
730 659
@@ -981,10 +910,9 @@ ERR_lib_error_string(unsigned long e)
981 if (!OPENSSL_init_crypto(0, NULL)) 910 if (!OPENSSL_init_crypto(0, NULL))
982 return NULL; 911 return NULL;
983 912
984 err_fns_check();
985 l = ERR_GET_LIB(e); 913 l = ERR_GET_LIB(e);
986 d.error = ERR_PACK(l, 0, 0); 914 d.error = ERR_PACK(l, 0, 0);
987 p = ERRFN(err_get_item)(&d); 915 p = err_get_item(&d);
988 return ((p == NULL) ? NULL : p->string); 916 return ((p == NULL) ? NULL : p->string);
989} 917}
990LCRYPTO_ALIAS(ERR_lib_error_string); 918LCRYPTO_ALIAS(ERR_lib_error_string);
@@ -996,11 +924,10 @@ ERR_func_error_string(unsigned long e)
996 ERR_STRING_DATA d; 924 ERR_STRING_DATA d;
997 unsigned long l, f; 925 unsigned long l, f;
998 926
999 err_fns_check();
1000 l = ERR_GET_LIB(e); 927 l = ERR_GET_LIB(e);
1001 f = ERR_GET_FUNC(e); 928 f = ERR_GET_FUNC(e);
1002 d.error = ERR_PACK(l, f, 0); 929 d.error = ERR_PACK(l, f, 0);
1003 p = ERRFN(err_get_item)(&d); 930 p = err_get_item(&d);
1004 return ((p == NULL) ? NULL : p->string); 931 return ((p == NULL) ? NULL : p->string);
1005} 932}
1006LCRYPTO_ALIAS(ERR_func_error_string); 933LCRYPTO_ALIAS(ERR_func_error_string);
@@ -1012,14 +939,13 @@ ERR_reason_error_string(unsigned long e)
1012 ERR_STRING_DATA d; 939 ERR_STRING_DATA d;
1013 unsigned long l, r; 940 unsigned long l, r;
1014 941
1015 err_fns_check();
1016 l = ERR_GET_LIB(e); 942 l = ERR_GET_LIB(e);
1017 r = ERR_GET_REASON(e); 943 r = ERR_GET_REASON(e);
1018 d.error = ERR_PACK(l, 0, r); 944 d.error = ERR_PACK(l, 0, r);
1019 p = ERRFN(err_get_item)(&d); 945 p = err_get_item(&d);
1020 if (!p) { 946 if (!p) {
1021 d.error = ERR_PACK(0, 0, r); 947 d.error = ERR_PACK(0, 0, r);
1022 p = ERRFN(err_get_item)(&d); 948 p = err_get_item(&d);
1023 } 949 }
1024 return ((p == NULL) ? NULL : p->string); 950 return ((p == NULL) ? NULL : p->string);
1025} 951}
@@ -1034,10 +960,9 @@ ERR_remove_thread_state(const CRYPTO_THREADID *id)
1034 CRYPTO_THREADID_cpy(&tmp.tid, id); 960 CRYPTO_THREADID_cpy(&tmp.tid, id);
1035 else 961 else
1036 CRYPTO_THREADID_current(&tmp.tid); 962 CRYPTO_THREADID_current(&tmp.tid);
1037 err_fns_check(); 963 /* err_thread_del_item automatically destroys the LHASH if the number of
1038 /* thread_del_item automatically destroys the LHASH if the number of
1039 * items reaches zero. */ 964 * items reaches zero. */
1040 ERRFN(thread_del_item)(&tmp); 965 err_thread_del_item(&tmp);
1041} 966}
1042LCRYPTO_ALIAS(ERR_remove_thread_state); 967LCRYPTO_ALIAS(ERR_remove_thread_state);
1043 968
@@ -1056,10 +981,9 @@ ERR_get_state(void)
1056 int i; 981 int i;
1057 CRYPTO_THREADID tid; 982 CRYPTO_THREADID tid;
1058 983
1059 err_fns_check();
1060 CRYPTO_THREADID_current(&tid); 984 CRYPTO_THREADID_current(&tid);
1061 CRYPTO_THREADID_cpy(&tmp.tid, &tid); 985 CRYPTO_THREADID_cpy(&tmp.tid, &tid);
1062 ret = ERRFN(thread_get_item)(&tmp); 986 ret = err_thread_get_item(&tmp);
1063 987
1064 /* ret == the error state, if NULL, make a new one */ 988 /* ret == the error state, if NULL, make a new one */
1065 if (ret == NULL) { 989 if (ret == NULL) {
@@ -1073,9 +997,9 @@ ERR_get_state(void)
1073 ret->err_data[i] = NULL; 997 ret->err_data[i] = NULL;
1074 ret->err_data_flags[i] = 0; 998 ret->err_data_flags[i] = 0;
1075 } 999 }
1076 tmpp = ERRFN(thread_set_item)(ret); 1000 tmpp = err_thread_set_item(ret);
1077 /* To check if insertion failed, do a get. */ 1001 /* To check if insertion failed, do a get. */
1078 if (ERRFN(thread_get_item)(ret) != ret) { 1002 if (err_thread_get_item(ret) != ret) {
1079 ERR_STATE_free(ret); /* could not insert it */ 1003 ERR_STATE_free(ret); /* could not insert it */
1080 return (&fallback); 1004 return (&fallback);
1081 } 1005 }
@@ -1090,8 +1014,7 @@ ERR_get_state(void)
1090int 1014int
1091ERR_get_next_error_library(void) 1015ERR_get_next_error_library(void)
1092{ 1016{
1093 err_fns_check(); 1017 return err_get_next_lib();
1094 return ERRFN(get_next_lib)();
1095} 1018}
1096LCRYPTO_ALIAS(ERR_get_next_error_library); 1019LCRYPTO_ALIAS(ERR_get_next_error_library);
1097 1020