summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/err
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
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')
-rw-r--r--src/lib/libcrypto/err/err.c47
-rw-r--r--src/lib/libcrypto/err/err_local.h123
2 files changed, 153 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();
diff --git a/src/lib/libcrypto/err/err_local.h b/src/lib/libcrypto/err/err_local.h
new file mode 100644
index 0000000000..d091b979cc
--- /dev/null
+++ b/src/lib/libcrypto/err/err_local.h
@@ -0,0 +1,123 @@
1/* $OpenBSD: err_local.h,v 1.1 2024/06/24 06:43:22 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#include <openssl/err.h>
113
114#ifndef HEADER_ERR_LOCAL_H
115#define HEADER_ERR_LOCAL_H
116
117__BEGIN_HIDDEN_DECLS
118
119void ERR_load_const_strings(const ERR_STRING_DATA *str);
120
121__END_HIDDEN_DECLS
122
123#endif /* HEADER_ERR_LOCAL_H */