diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/conf/conf_mod.c | 89 |
1 files changed, 9 insertions, 80 deletions
diff --git a/src/lib/libcrypto/conf/conf_mod.c b/src/lib/libcrypto/conf/conf_mod.c index 9f252385e8..aab108a260 100644 --- a/src/lib/libcrypto/conf/conf_mod.c +++ b/src/lib/libcrypto/conf/conf_mod.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: conf_mod.c,v 1.27 2017/01/29 17:49:22 beck Exp $ */ | 1 | /* $OpenBSD: conf_mod.c,v 1.28 2023/07/20 15:05:30 tb Exp $ */ |
2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2001. | 3 | * project 2001. |
4 | */ | 4 | */ |
@@ -63,21 +63,11 @@ | |||
63 | 63 | ||
64 | #include <openssl/conf.h> | 64 | #include <openssl/conf.h> |
65 | #include <openssl/crypto.h> | 65 | #include <openssl/crypto.h> |
66 | #include <openssl/dso.h> | ||
67 | #include <openssl/err.h> | 66 | #include <openssl/err.h> |
68 | #include <openssl/x509.h> | 67 | #include <openssl/x509.h> |
69 | 68 | ||
70 | #define DSO_mod_init_name "OPENSSL_init" | 69 | /* This structure contains data about supported modules. */ |
71 | #define DSO_mod_finish_name "OPENSSL_finish" | ||
72 | |||
73 | /* This structure contains a data about supported modules. | ||
74 | * entries in this table correspond to either dynamic or | ||
75 | * static modules. | ||
76 | */ | ||
77 | |||
78 | struct conf_module_st { | 70 | struct conf_module_st { |
79 | /* DSO of this module or NULL if static */ | ||
80 | DSO *dso; | ||
81 | /* Name of the module */ | 71 | /* Name of the module */ |
82 | char *name; | 72 | char *name; |
83 | /* Init function */ | 73 | /* Init function */ |
@@ -110,13 +100,11 @@ static void module_free(CONF_MODULE *md); | |||
110 | static void module_finish(CONF_IMODULE *imod); | 100 | static void module_finish(CONF_IMODULE *imod); |
111 | static int module_run(const CONF *cnf, char *name, char *value, | 101 | static int module_run(const CONF *cnf, char *name, char *value, |
112 | unsigned long flags); | 102 | unsigned long flags); |
113 | static CONF_MODULE *module_add(DSO *dso, const char *name, | 103 | static CONF_MODULE *module_add(const char *name, conf_init_func *ifunc, |
114 | conf_init_func *ifunc, conf_finish_func *ffunc); | 104 | conf_finish_func *ffunc); |
115 | static CONF_MODULE *module_find(char *name); | 105 | static CONF_MODULE *module_find(char *name); |
116 | static int module_init(CONF_MODULE *pmod, char *name, char *value, | 106 | static int module_init(CONF_MODULE *pmod, char *name, char *value, |
117 | const CONF *cnf); | 107 | const CONF *cnf); |
118 | static CONF_MODULE *module_load_dso(const CONF *cnf, char *name, char *value, | ||
119 | unsigned long flags); | ||
120 | 108 | ||
121 | /* Main function: load modules from a CONF structure */ | 109 | /* Main function: load modules from a CONF structure */ |
122 | 110 | ||
@@ -203,13 +191,7 @@ module_run(const CONF *cnf, char *name, char *value, unsigned long flags) | |||
203 | CONF_MODULE *md; | 191 | CONF_MODULE *md; |
204 | int ret; | 192 | int ret; |
205 | 193 | ||
206 | md = module_find(name); | 194 | if ((md = module_find(name)) == NULL) { |
207 | |||
208 | /* Module not found: try to load DSO */ | ||
209 | if (!md && !(flags & CONF_MFLAGS_NO_DSO)) | ||
210 | md = module_load_dso(cnf, name, value, flags); | ||
211 | |||
212 | if (!md) { | ||
213 | if (!(flags & CONF_MFLAGS_SILENT)) { | 195 | if (!(flags & CONF_MFLAGS_SILENT)) { |
214 | CONFerror(CONF_R_UNKNOWN_MODULE_NAME); | 196 | CONFerror(CONF_R_UNKNOWN_MODULE_NAME); |
215 | ERR_asprintf_error_data("module=%s", name); | 197 | ERR_asprintf_error_data("module=%s", name); |
@@ -231,54 +213,9 @@ module_run(const CONF *cnf, char *name, char *value, unsigned long flags) | |||
231 | return ret; | 213 | return ret; |
232 | } | 214 | } |
233 | 215 | ||
234 | /* Load a module from a DSO */ | ||
235 | static CONF_MODULE * | ||
236 | module_load_dso(const CONF *cnf, char *name, char *value, unsigned long flags) | ||
237 | { | ||
238 | DSO *dso = NULL; | ||
239 | conf_init_func *ifunc; | ||
240 | conf_finish_func *ffunc; | ||
241 | char *path = NULL; | ||
242 | int errcode = 0; | ||
243 | CONF_MODULE *md; | ||
244 | |||
245 | /* Look for alternative path in module section */ | ||
246 | path = NCONF_get_string(cnf, value, "path"); | ||
247 | if (!path) { | ||
248 | ERR_clear_error(); | ||
249 | path = name; | ||
250 | } | ||
251 | dso = DSO_load(NULL, path, NULL, 0); | ||
252 | if (!dso) { | ||
253 | errcode = CONF_R_ERROR_LOADING_DSO; | ||
254 | goto err; | ||
255 | } | ||
256 | ifunc = (conf_init_func *)DSO_bind_func(dso, DSO_mod_init_name); | ||
257 | if (!ifunc) { | ||
258 | errcode = CONF_R_MISSING_INIT_FUNCTION; | ||
259 | goto err; | ||
260 | } | ||
261 | ffunc = (conf_finish_func *)DSO_bind_func(dso, DSO_mod_finish_name); | ||
262 | /* All OK, add module */ | ||
263 | md = module_add(dso, name, ifunc, ffunc); | ||
264 | |||
265 | if (!md) | ||
266 | goto err; | ||
267 | |||
268 | return md; | ||
269 | |||
270 | err: | ||
271 | if (dso) | ||
272 | DSO_free(dso); | ||
273 | CONFerror(errcode); | ||
274 | ERR_asprintf_error_data("module=%s, path=%s", name, path); | ||
275 | return NULL; | ||
276 | } | ||
277 | |||
278 | /* add module to list */ | 216 | /* add module to list */ |
279 | static CONF_MODULE * | 217 | static CONF_MODULE * |
280 | module_add(DSO *dso, const char *name, conf_init_func *ifunc, | 218 | module_add(const char *name, conf_init_func *ifunc, conf_finish_func *ffunc) |
281 | conf_finish_func *ffunc) | ||
282 | { | 219 | { |
283 | CONF_MODULE *tmod = NULL; | 220 | CONF_MODULE *tmod = NULL; |
284 | 221 | ||
@@ -292,7 +229,6 @@ module_add(DSO *dso, const char *name, conf_init_func *ifunc, | |||
292 | if (tmod == NULL) | 229 | if (tmod == NULL) |
293 | return NULL; | 230 | return NULL; |
294 | 231 | ||
295 | tmod->dso = dso; | ||
296 | tmod->name = strdup(name); | 232 | tmod->name = strdup(name); |
297 | tmod->init = ifunc; | 233 | tmod->init = ifunc; |
298 | tmod->finish = ffunc; | 234 | tmod->finish = ffunc; |
@@ -412,8 +348,7 @@ CONF_modules_unload(int all) | |||
412 | /* unload modules in reverse order */ | 348 | /* unload modules in reverse order */ |
413 | for (i = sk_CONF_MODULE_num(supported_modules) - 1; i >= 0; i--) { | 349 | for (i = sk_CONF_MODULE_num(supported_modules) - 1; i >= 0; i--) { |
414 | md = sk_CONF_MODULE_value(supported_modules, i); | 350 | md = sk_CONF_MODULE_value(supported_modules, i); |
415 | /* If static or in use and 'all' not set ignore it */ | 351 | if (!all) |
416 | if (((md->links > 0) || !md->dso) && !all) | ||
417 | continue; | 352 | continue; |
418 | /* Since we're working in reverse this is OK */ | 353 | /* Since we're working in reverse this is OK */ |
419 | (void)sk_CONF_MODULE_delete(supported_modules, i); | 354 | (void)sk_CONF_MODULE_delete(supported_modules, i); |
@@ -429,8 +364,6 @@ CONF_modules_unload(int all) | |||
429 | static void | 364 | static void |
430 | module_free(CONF_MODULE *md) | 365 | module_free(CONF_MODULE *md) |
431 | { | 366 | { |
432 | if (md->dso) | ||
433 | DSO_free(md->dso); | ||
434 | free(md->name); | 367 | free(md->name); |
435 | free(md); | 368 | free(md); |
436 | } | 369 | } |
@@ -466,13 +399,9 @@ module_finish(CONF_IMODULE *imod) | |||
466 | /* Add a static module to OpenSSL */ | 399 | /* Add a static module to OpenSSL */ |
467 | 400 | ||
468 | int | 401 | int |
469 | CONF_module_add(const char *name, conf_init_func *ifunc, | 402 | CONF_module_add(const char *name, conf_init_func *ifunc, conf_finish_func *ffunc) |
470 | conf_finish_func *ffunc) | ||
471 | { | 403 | { |
472 | if (module_add(NULL, name, ifunc, ffunc)) | 404 | return module_add(name, ifunc, ffunc) != NULL; |
473 | return 1; | ||
474 | else | ||
475 | return 0; | ||
476 | } | 405 | } |
477 | 406 | ||
478 | void | 407 | void |