summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/err/err.c
diff options
context:
space:
mode:
authortb <>2024-06-24 06:43:23 +0000
committertb <>2024-06-24 06:43:23 +0000
commit9bdf4013203aab2bc8161884feb7398faa560fa4 (patch)
tree5e01786fba8689c1ae97aaf149972572fbcd4015 /src/lib/libcrypto/err/err.c
parent8352adcf928da844a48a04816460acf0524fada9 (diff)
downloadopenbsd-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.c47
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 */
261static LHASH_OF(ERR_STRING_DATA) *int_err_get(int create); 261static LHASH_OF(ERR_STRING_DATA) *int_err_get(int create);
262static void int_err_del(void); 262static void int_err_del(void);
263static ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *); 263static const ERR_STRING_DATA *int_err_get_item(const ERR_STRING_DATA *);
264static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *); 264static const ERR_STRING_DATA *int_err_set_item(const ERR_STRING_DATA *);
265static ERR_STRING_DATA *int_err_del_item(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); 266static LHASH_OF(ERR_STATE) *int_thread_get(int create);
267static void int_thread_release(LHASH_OF(ERR_STATE) **hash); 267static void int_thread_release(LHASH_OF(ERR_STATE) **hash);
268static ERR_STATE *int_thread_get_item(const ERR_STATE *); 268static 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
372static ERR_STRING_DATA * 372static const ERR_STRING_DATA *
373int_err_get_item(const ERR_STRING_DATA *d) 373int_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
390static ERR_STRING_DATA * 390static const ERR_STRING_DATA *
391int_err_set_item(ERR_STRING_DATA *d) 391int_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
408static ERR_STRING_DATA * 408static const ERR_STRING_DATA *
409int_err_del_item(ERR_STRING_DATA *d) 409int_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)
693LCRYPTO_ALIAS(ERR_load_strings); 693LCRYPTO_ALIAS(ERR_load_strings);
694 694
695void 695void
696ERR_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
705void
696ERR_unload_strings(int lib, ERR_STRING_DATA *str) 706ERR_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);
964const char * 974const char *
965ERR_lib_error_string(unsigned long e) 975ERR_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);
981const char * 992const char *
982ERR_func_error_string(unsigned long e) 993ERR_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);
996const char * 1008const char *
997ERR_reason_error_string(unsigned long e) 1009ERR_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();