summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ex_data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ex_data.c')
-rw-r--r--src/lib/libcrypto/ex_data.c56
1 files changed, 22 insertions, 34 deletions
diff --git a/src/lib/libcrypto/ex_data.c b/src/lib/libcrypto/ex_data.c
index 71b2fc397b..17db16e58d 100644
--- a/src/lib/libcrypto/ex_data.c
+++ b/src/lib/libcrypto/ex_data.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ex_data.c,v 1.22 2023/07/08 08:28:23 beck Exp $ */ 1/* $OpenBSD: ex_data.c,v 1.23 2023/07/28 10:19:20 tb Exp $ */
2 2
3/* 3/*
4 * Overhaul notes; 4 * Overhaul notes;
@@ -141,6 +141,26 @@
141#include <openssl/err.h> 141#include <openssl/err.h>
142#include <openssl/lhash.h> 142#include <openssl/lhash.h>
143 143
144typedef struct crypto_ex_data_func_st {
145 long argl; /* Arbitrary long */
146 void *argp; /* Arbitrary void * */
147 CRYPTO_EX_new *new_func;
148 CRYPTO_EX_free *free_func;
149 CRYPTO_EX_dup *dup_func;
150} CRYPTO_EX_DATA_FUNCS;
151
152DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS)
153
154#define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS)
155#define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st))
156#define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i))
157#define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val))
158#define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val))
159#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func))
160
161/* An opaque type representing an implementation of "ex_data" support */
162typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL;
163
144/* What an "implementation of ex_data functionality" looks like */ 164/* What an "implementation of ex_data functionality" looks like */
145struct st_CRYPTO_EX_DATA_IMPL { 165struct st_CRYPTO_EX_DATA_IMPL {
146 /*********************/ 166 /*********************/
@@ -210,29 +230,6 @@ impl_check(void)
210 * invoking the function (which checks again inside a lock). */ 230 * invoking the function (which checks again inside a lock). */
211#define IMPL_CHECK if(!impl) impl_check(); 231#define IMPL_CHECK if(!impl) impl_check();
212 232
213/* API functions to get/set the "ex_data" implementation */
214const CRYPTO_EX_DATA_IMPL *
215CRYPTO_get_ex_data_implementation(void)
216{
217 IMPL_CHECK
218 return impl;
219}
220LCRYPTO_ALIAS(CRYPTO_get_ex_data_implementation);
221
222int
223CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i)
224{
225 int toret = 0;
226 CRYPTO_w_lock(CRYPTO_LOCK_EX_DATA);
227 if (!impl) {
228 impl = i;
229 toret = 1;
230 }
231 CRYPTO_w_unlock(CRYPTO_LOCK_EX_DATA);
232 return toret;
233}
234LCRYPTO_ALIAS(CRYPTO_set_ex_data_implementation);
235
236/****************************************************************************/ 233/****************************************************************************/
237/* Interal (default) implementation of "ex_data" support. API functions are 234/* Interal (default) implementation of "ex_data" support. API functions are
238 * further down. */ 235 * further down. */
@@ -247,6 +244,7 @@ typedef struct st_ex_class_item {
247} EX_CLASS_ITEM; 244} EX_CLASS_ITEM;
248 245
249/* When assigning new class indexes, this is our counter */ 246/* When assigning new class indexes, this is our counter */
247#define CRYPTO_EX_INDEX_USER 100
250static int ex_class = CRYPTO_EX_INDEX_USER; 248static int ex_class = CRYPTO_EX_INDEX_USER;
251 249
252/* The global hash table of EX_CLASS_ITEM items */ 250/* The global hash table of EX_CLASS_ITEM items */
@@ -541,16 +539,6 @@ skip:
541/* API functions that defer all "state" operations to the "ex_data" 539/* API functions that defer all "state" operations to the "ex_data"
542 * implementation we have set. */ 540 * implementation we have set. */
543 541
544/* Obtain an index for a new class (not the same as getting a new index within
545 * an existing class - this is actually getting a new *class*) */
546int
547CRYPTO_ex_data_new_class(void)
548{
549 IMPL_CHECK
550 return EX_IMPL(new_class)();
551}
552LCRYPTO_ALIAS(CRYPTO_ex_data_new_class);
553
554/* Release all "ex_data" state to prevent memory leaks. This can't be made 542/* Release all "ex_data" state to prevent memory leaks. This can't be made
555 * thread-safe without overhauling a lot of stuff, and shouldn't really be 543 * thread-safe without overhauling a lot of stuff, and shouldn't really be
556 * called under potential race-conditions anyway (it's for program shutdown 544 * called under potential race-conditions anyway (it's for program shutdown