diff options
author | tb <> | 2024-06-24 06:43:23 +0000 |
---|---|---|
committer | tb <> | 2024-06-24 06:43:23 +0000 |
commit | 9bdf4013203aab2bc8161884feb7398faa560fa4 (patch) | |
tree | 5e01786fba8689c1ae97aaf149972572fbcd4015 /src/lib/libcrypto/err/err.c | |
parent | 8352adcf928da844a48a04816460acf0524fada9 (diff) | |
download | openbsd-9bdf4013203aab2bc8161884feb7398faa560fa4.tar.gz openbsd-9bdf4013203aab2bc8161884feb7398faa560fa4.tar.bz2 openbsd-9bdf4013203aab2bc8161884feb7398faa560fa4.zip |
libcrypto: constify most error string tables
These constitute the bulk of the remaining global mutable state in
libcrypto. This commit moves most of them into data.rel.ro, leaving
out ERR_str_{functs,libraries,reasons} (which require a slightly
different approach) and SYS_str_reasons which is populated on startup.
The main observation is that if ERR_load_strings() is called with a 0 lib
argument, the ERR_STRING_DATA argument is not actually modified. We could
use this fact to cast away const on the caller side and be done with it.
We can make this cleaner by adding a helper ERR_load_const_strings() which
explicitly avoids the assignment to str->error overriding the error code
already set in the table.
In order for this to work, we need to sprinkle some const in err/err.c.
CMS called ERR_load_strings() with non-0 lib argument, but this didn't
actually modify the error data since it ored in the value already stored
in the table.
Annoyingly, we need to cast const away once, namely in the call to
lh_insert() in int_err_set_item(). Fixing this would require changing
the public API and is going to be tricky since it requires that the
LHASH_DOALL_FN_* types adjust.
ok jsing
Diffstat (limited to 'src/lib/libcrypto/err/err.c')
-rw-r--r-- | src/lib/libcrypto/err/err.c | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/src/lib/libcrypto/err/err.c b/src/lib/libcrypto/err/err.c index a7b13a5404..583293e793 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.60 2024/03/02 11:37:13 tb Exp $ */ | 1 | /* $OpenBSD: err.c,v 1.61 2024/06/24 06:43:22 tb 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 | * |
@@ -244,9 +244,9 @@ struct st_ERR_FNS { | |||
244 | /* Works on the "error_hash" string table */ | 244 | /* Works on the "error_hash" string table */ |
245 | LHASH_OF(ERR_STRING_DATA) *(*cb_err_get)(int create); | 245 | LHASH_OF(ERR_STRING_DATA) *(*cb_err_get)(int create); |
246 | void (*cb_err_del)(void); | 246 | void (*cb_err_del)(void); |
247 | ERR_STRING_DATA *(*cb_err_get_item)(const ERR_STRING_DATA *); | 247 | const ERR_STRING_DATA *(*cb_err_get_item)(const ERR_STRING_DATA *); |
248 | ERR_STRING_DATA *(*cb_err_set_item)(ERR_STRING_DATA *); | 248 | const ERR_STRING_DATA *(*cb_err_set_item)(const ERR_STRING_DATA *); |
249 | ERR_STRING_DATA *(*cb_err_del_item)(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 */ | 250 | /* Works on the "thread_hash" error-state table */ |
251 | LHASH_OF(ERR_STATE) *(*cb_thread_get)(int create); | 251 | LHASH_OF(ERR_STATE) *(*cb_thread_get)(int create); |
252 | void (*cb_thread_release)(LHASH_OF(ERR_STATE) **hash); | 252 | void (*cb_thread_release)(LHASH_OF(ERR_STATE) **hash); |
@@ -260,9 +260,9 @@ struct st_ERR_FNS { | |||
260 | /* Predeclarations of the "err_defaults" functions */ | 260 | /* Predeclarations of the "err_defaults" functions */ |
261 | static LHASH_OF(ERR_STRING_DATA) *int_err_get(int create); | 261 | static LHASH_OF(ERR_STRING_DATA) *int_err_get(int create); |
262 | static void int_err_del(void); | 262 | static void int_err_del(void); |
263 | static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *); | 263 | static const ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *); |
264 | static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *); | 264 | static const ERR_STRING_DATA *int_err_set_item(const ERR_STRING_DATA *); |
265 | static ERR_STRING_DATA *int_err_del_item(ERR_STRING_DATA *); | 265 | static const ERR_STRING_DATA *int_err_del_item(const ERR_STRING_DATA *); |
266 | static LHASH_OF(ERR_STATE) *int_thread_get(int create); | 266 | static LHASH_OF(ERR_STATE) *int_thread_get(int create); |
267 | static void int_thread_release(LHASH_OF(ERR_STATE) **hash); | 267 | static void int_thread_release(LHASH_OF(ERR_STATE) **hash); |
268 | static ERR_STATE *int_thread_get_item(const ERR_STATE *); | 268 | static ERR_STATE *int_thread_get_item(const ERR_STATE *); |
@@ -369,7 +369,7 @@ int_err_del(void) | |||
369 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | 369 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); |
370 | } | 370 | } |
371 | 371 | ||
372 | static ERR_STRING_DATA * | 372 | static const ERR_STRING_DATA * |
373 | int_err_get_item(const ERR_STRING_DATA *d) | 373 | int_err_get_item(const ERR_STRING_DATA *d) |
374 | { | 374 | { |
375 | ERR_STRING_DATA *p; | 375 | ERR_STRING_DATA *p; |
@@ -387,10 +387,10 @@ int_err_get_item(const ERR_STRING_DATA *d) | |||
387 | return p; | 387 | return p; |
388 | } | 388 | } |
389 | 389 | ||
390 | static ERR_STRING_DATA * | 390 | static const ERR_STRING_DATA * |
391 | int_err_set_item(ERR_STRING_DATA *d) | 391 | int_err_set_item(const ERR_STRING_DATA *d) |
392 | { | 392 | { |
393 | ERR_STRING_DATA *p; | 393 | const ERR_STRING_DATA *p; |
394 | LHASH_OF(ERR_STRING_DATA) *hash; | 394 | LHASH_OF(ERR_STRING_DATA) *hash; |
395 | 395 | ||
396 | err_fns_check(); | 396 | err_fns_check(); |
@@ -399,14 +399,14 @@ int_err_set_item(ERR_STRING_DATA *d) | |||
399 | return NULL; | 399 | return NULL; |
400 | 400 | ||
401 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); | 401 | CRYPTO_w_lock(CRYPTO_LOCK_ERR); |
402 | p = lh_ERR_STRING_DATA_insert(hash, d); | 402 | p = lh_ERR_STRING_DATA_insert(hash, (void *)d); |
403 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); | 403 | CRYPTO_w_unlock(CRYPTO_LOCK_ERR); |
404 | 404 | ||
405 | return p; | 405 | return p; |
406 | } | 406 | } |
407 | 407 | ||
408 | static ERR_STRING_DATA * | 408 | static const ERR_STRING_DATA * |
409 | int_err_del_item(ERR_STRING_DATA *d) | 409 | int_err_del_item(const ERR_STRING_DATA *d) |
410 | { | 410 | { |
411 | ERR_STRING_DATA *p; | 411 | ERR_STRING_DATA *p; |
412 | LHASH_OF(ERR_STRING_DATA) *hash; | 412 | LHASH_OF(ERR_STRING_DATA) *hash; |
@@ -693,6 +693,16 @@ ERR_load_strings(int lib, ERR_STRING_DATA *str) | |||
693 | LCRYPTO_ALIAS(ERR_load_strings); | 693 | LCRYPTO_ALIAS(ERR_load_strings); |
694 | 694 | ||
695 | void | 695 | void |
696 | ERR_load_const_strings(const ERR_STRING_DATA *str) | ||
697 | { | ||
698 | ERR_load_ERR_strings(); | ||
699 | while (str->error) { | ||
700 | ERRFN(err_set_item)(str); | ||
701 | str++; | ||
702 | } | ||
703 | } | ||
704 | |||
705 | void | ||
696 | ERR_unload_strings(int lib, ERR_STRING_DATA *str) | 706 | ERR_unload_strings(int lib, ERR_STRING_DATA *str) |
697 | { | 707 | { |
698 | /* Prayer and clean living lets you ignore errors, OpenSSL style */ | 708 | /* Prayer and clean living lets you ignore errors, OpenSSL style */ |
@@ -964,7 +974,8 @@ LCRYPTO_ALIAS(ERR_error_string); | |||
964 | const char * | 974 | const char * |
965 | ERR_lib_error_string(unsigned long e) | 975 | ERR_lib_error_string(unsigned long e) |
966 | { | 976 | { |
967 | ERR_STRING_DATA d, *p; | 977 | const ERR_STRING_DATA *p; |
978 | ERR_STRING_DATA d; | ||
968 | unsigned long l; | 979 | unsigned long l; |
969 | 980 | ||
970 | if (!OPENSSL_init_crypto(0, NULL)) | 981 | if (!OPENSSL_init_crypto(0, NULL)) |
@@ -981,7 +992,8 @@ LCRYPTO_ALIAS(ERR_lib_error_string); | |||
981 | const char * | 992 | const char * |
982 | ERR_func_error_string(unsigned long e) | 993 | ERR_func_error_string(unsigned long e) |
983 | { | 994 | { |
984 | ERR_STRING_DATA d, *p; | 995 | const ERR_STRING_DATA *p; |
996 | ERR_STRING_DATA d; | ||
985 | unsigned long l, f; | 997 | unsigned long l, f; |
986 | 998 | ||
987 | err_fns_check(); | 999 | err_fns_check(); |
@@ -996,7 +1008,8 @@ LCRYPTO_ALIAS(ERR_func_error_string); | |||
996 | const char * | 1008 | const char * |
997 | ERR_reason_error_string(unsigned long e) | 1009 | ERR_reason_error_string(unsigned long e) |
998 | { | 1010 | { |
999 | ERR_STRING_DATA d, *p = NULL; | 1011 | const ERR_STRING_DATA *p = NULL; |
1012 | ERR_STRING_DATA d; | ||
1000 | unsigned long l, r; | 1013 | unsigned long l, r; |
1001 | 1014 | ||
1002 | err_fns_check(); | 1015 | err_fns_check(); |