Coverage Report

Created: 2025-07-18 07:25

/src/irssi/subprojects/openssl-1.1.1l/crypto/init.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the OpenSSL license (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
#include "e_os.h"
11
#include "crypto/cryptlib.h"
12
#include <openssl/err.h>
13
#include "crypto/rand.h"
14
#include "internal/bio.h"
15
#include <openssl/evp.h>
16
#include "crypto/evp.h"
17
#include "internal/conf.h"
18
#include "crypto/async.h"
19
#include "crypto/engine.h"
20
#include "internal/comp.h"
21
#include "internal/err.h"
22
#include "crypto/err.h"
23
#include "crypto/objects.h"
24
#include <stdlib.h>
25
#include <assert.h>
26
#include "internal/thread_once.h"
27
#include "crypto/dso_conf.h"
28
#include "internal/dso.h"
29
#include "crypto/store.h"
30
31
static int stopped = 0;
32
33
/*
34
 * Since per-thread-specific-data destructors are not universally
35
 * available, i.e. not on Windows, only below CRYPTO_THREAD_LOCAL key
36
 * is assumed to have destructor associated. And then an effort is made
37
 * to call this single destructor on non-pthread platform[s].
38
 *
39
 * Initial value is "impossible". It is used as guard value to shortcut
40
 * destructor for threads terminating before libcrypto is initialized or
41
 * after it's de-initialized. Access to the key doesn't have to be
42
 * serialized for the said threads, because they didn't use libcrypto
43
 * and it doesn't matter if they pick "impossible" or dereference real
44
 * key value and pull NULL past initialization in the first thread that
45
 * intends to use libcrypto.
46
 */
47
static union {
48
    long sane;
49
    CRYPTO_THREAD_LOCAL value;
50
} destructor_key = { -1 };
51
52
static void ossl_init_thread_stop(struct thread_local_inits_st *locals);
53
54
static void ossl_init_thread_destructor(void *local)
55
0
{
56
0
    ossl_init_thread_stop((struct thread_local_inits_st *)local);
57
0
}
58
59
static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
60
6
{
61
6
    struct thread_local_inits_st *local =
62
6
        CRYPTO_THREAD_get_local(&destructor_key.value);
63
64
6
    if (alloc) {
65
4
        if (local == NULL
66
4
            && (local = OPENSSL_zalloc(sizeof(*local))) != NULL
67
4
            && !CRYPTO_THREAD_set_local(&destructor_key.value, local)) {
68
0
            OPENSSL_free(local);
69
0
            return NULL;
70
0
        }
71
4
    } else {
72
2
        CRYPTO_THREAD_set_local(&destructor_key.value, NULL);
73
2
    }
74
75
6
    return local;
76
6
}
77
78
typedef struct ossl_init_stop_st OPENSSL_INIT_STOP;
79
struct ossl_init_stop_st {
80
    void (*handler)(void);
81
    OPENSSL_INIT_STOP *next;
82
};
83
84
static OPENSSL_INIT_STOP *stop_handlers = NULL;
85
static CRYPTO_RWLOCK *init_lock = NULL;
86
87
static CRYPTO_ONCE base = CRYPTO_ONCE_STATIC_INIT;
88
static int base_inited = 0;
89
DEFINE_RUN_ONCE_STATIC(ossl_init_base)
90
2
{
91
2
    CRYPTO_THREAD_LOCAL key;
92
93
#ifdef OPENSSL_INIT_DEBUG
94
    fprintf(stderr, "OPENSSL_INIT: ossl_init_base: Setting up stop handlers\n");
95
#endif
96
#ifndef OPENSSL_NO_CRYPTO_MDEBUG
97
    ossl_malloc_setup_failures();
98
#endif
99
2
    if (!CRYPTO_THREAD_init_local(&key, ossl_init_thread_destructor))
100
0
        return 0;
101
2
    if ((init_lock = CRYPTO_THREAD_lock_new()) == NULL)
102
0
        goto err;
103
2
    OPENSSL_cpuid_setup();
104
105
2
    destructor_key.value = key;
106
2
    base_inited = 1;
107
2
    return 1;
108
109
0
err:
110
#ifdef OPENSSL_INIT_DEBUG
111
    fprintf(stderr, "OPENSSL_INIT: ossl_init_base not ok!\n");
112
#endif
113
0
    CRYPTO_THREAD_lock_free(init_lock);
114
0
    init_lock = NULL;
115
116
0
    CRYPTO_THREAD_cleanup_local(&key);
117
0
    return 0;
118
2
}
119
120
static CRYPTO_ONCE register_atexit = CRYPTO_ONCE_STATIC_INIT;
121
#if !defined(OPENSSL_SYS_UEFI) && defined(_WIN32)
122
static int win32atexit(void)
123
{
124
    OPENSSL_cleanup();
125
    return 0;
126
}
127
#endif
128
129
DEFINE_RUN_ONCE_STATIC(ossl_init_register_atexit)
130
2
{
131
#ifdef OPENSSL_INIT_DEBUG
132
    fprintf(stderr, "OPENSSL_INIT: ossl_init_register_atexit()\n");
133
#endif
134
2
#ifndef OPENSSL_SYS_UEFI
135
# ifdef _WIN32
136
    /* We use _onexit() in preference because it gets called on DLL unload */
137
    if (_onexit(win32atexit) == NULL)
138
        return 0;
139
# else
140
2
    if (atexit(OPENSSL_cleanup) != 0)
141
0
        return 0;
142
2
# endif
143
2
#endif
144
145
2
    return 1;
146
2
}
147
148
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_register_atexit,
149
                           ossl_init_register_atexit)
150
0
{
151
#ifdef OPENSSL_INIT_DEBUG
152
    fprintf(stderr, "OPENSSL_INIT: ossl_init_no_register_atexit ok!\n");
153
#endif
154
    /* Do nothing in this case */
155
0
    return 1;
156
0
}
157
158
static CRYPTO_ONCE load_crypto_nodelete = CRYPTO_ONCE_STATIC_INIT;
159
DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_nodelete)
160
2
{
161
#ifdef OPENSSL_INIT_DEBUG
162
    fprintf(stderr, "OPENSSL_INIT: ossl_init_load_crypto_nodelete()\n");
163
#endif
164
#if !defined(OPENSSL_USE_NODELETE) \
165
    && !defined(OPENSSL_NO_PINSHARED)
166
# if defined(DSO_WIN32) && !defined(_WIN32_WCE)
167
    {
168
        HMODULE handle = NULL;
169
        BOOL ret;
170
171
        /* We don't use the DSO route for WIN32 because there is a better way */
172
        ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
173
                                | GET_MODULE_HANDLE_EX_FLAG_PIN,
174
                                (void *)&base_inited, &handle);
175
176
#  ifdef OPENSSL_INIT_DEBUG
177
        fprintf(stderr, "OPENSSL_INIT: obtained DSO reference? %s\n",
178
                (ret == TRUE ? "No!" : "Yes."));
179
#  endif
180
        return (ret == TRUE) ? 1 : 0;
181
    }
182
# elif !defined(DSO_NONE)
183
    /*
184
     * Deliberately leak a reference to ourselves. This will force the library
185
     * to remain loaded until the atexit() handler is run at process exit.
186
     */
187
    {
188
        DSO *dso;
189
        void *err;
190
191
        if (!err_shelve_state(&err))
192
            return 0;
193
194
        dso = DSO_dsobyaddr(&base_inited, DSO_FLAG_NO_UNLOAD_ON_FREE);
195
#  ifdef OPENSSL_INIT_DEBUG
196
        fprintf(stderr, "OPENSSL_INIT: obtained DSO reference? %s\n",
197
                (dso == NULL ? "No!" : "Yes."));
198
        /*
199
         * In case of No!, it is uncertain our exit()-handlers can still be
200
         * called. After dlclose() the whole library might have been unloaded
201
         * already.
202
         */
203
#  endif
204
        DSO_free(dso);
205
        err_unshelve_state(err);
206
    }
207
# endif
208
#endif
209
210
2
    return 1;
211
2
}
212
213
static CRYPTO_ONCE load_crypto_strings = CRYPTO_ONCE_STATIC_INIT;
214
static int load_crypto_strings_inited = 0;
215
DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_strings)
216
2
{
217
2
    int ret = 1;
218
    /*
219
     * OPENSSL_NO_AUTOERRINIT is provided here to prevent at compile time
220
     * pulling in all the error strings during static linking
221
     */
222
2
#if !defined(OPENSSL_NO_ERR) && !defined(OPENSSL_NO_AUTOERRINIT)
223
# ifdef OPENSSL_INIT_DEBUG
224
    fprintf(stderr, "OPENSSL_INIT: ossl_init_load_crypto_strings: "
225
                    "err_load_crypto_strings_int()\n");
226
# endif
227
2
    ret = err_load_crypto_strings_int();
228
2
    load_crypto_strings_inited = 1;
229
2
#endif
230
2
    return ret;
231
2
}
232
233
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_load_crypto_strings,
234
                           ossl_init_load_crypto_strings)
235
0
{
236
    /* Do nothing in this case */
237
0
    return 1;
238
0
}
239
240
static CRYPTO_ONCE add_all_ciphers = CRYPTO_ONCE_STATIC_INIT;
241
DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_ciphers)
242
2
{
243
    /*
244
     * OPENSSL_NO_AUTOALGINIT is provided here to prevent at compile time
245
     * pulling in all the ciphers during static linking
246
     */
247
2
#ifndef OPENSSL_NO_AUTOALGINIT
248
# ifdef OPENSSL_INIT_DEBUG
249
    fprintf(stderr, "OPENSSL_INIT: ossl_init_add_all_ciphers: "
250
                    "openssl_add_all_ciphers_int()\n");
251
# endif
252
2
    openssl_add_all_ciphers_int();
253
2
#endif
254
2
    return 1;
255
2
}
256
257
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_add_all_ciphers,
258
                           ossl_init_add_all_ciphers)
259
0
{
260
    /* Do nothing */
261
0
    return 1;
262
0
}
263
264
static CRYPTO_ONCE add_all_digests = CRYPTO_ONCE_STATIC_INIT;
265
DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_digests)
266
2
{
267
    /*
268
     * OPENSSL_NO_AUTOALGINIT is provided here to prevent at compile time
269
     * pulling in all the ciphers during static linking
270
     */
271
2
#ifndef OPENSSL_NO_AUTOALGINIT
272
# ifdef OPENSSL_INIT_DEBUG
273
    fprintf(stderr, "OPENSSL_INIT: ossl_init_add_all_digests: "
274
                    "openssl_add_all_digests()\n");
275
# endif
276
2
    openssl_add_all_digests_int();
277
2
#endif
278
2
    return 1;
279
2
}
280
281
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_add_all_digests,
282
                           ossl_init_add_all_digests)
283
0
{
284
    /* Do nothing */
285
0
    return 1;
286
0
}
287
288
static CRYPTO_ONCE config = CRYPTO_ONCE_STATIC_INIT;
289
static int config_inited = 0;
290
static const OPENSSL_INIT_SETTINGS *conf_settings = NULL;
291
DEFINE_RUN_ONCE_STATIC(ossl_init_config)
292
2
{
293
2
    int ret = openssl_config_int(conf_settings);
294
2
    config_inited = 1;
295
2
    return ret;
296
2
}
297
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_config, ossl_init_config)
298
0
{
299
#ifdef OPENSSL_INIT_DEBUG
300
    fprintf(stderr,
301
            "OPENSSL_INIT: ossl_init_config: openssl_no_config_int()\n");
302
#endif
303
0
    openssl_no_config_int();
304
0
    config_inited = 1;
305
0
    return 1;
306
0
}
307
308
static CRYPTO_ONCE async = CRYPTO_ONCE_STATIC_INIT;
309
static int async_inited = 0;
310
DEFINE_RUN_ONCE_STATIC(ossl_init_async)
311
0
{
312
#ifdef OPENSSL_INIT_DEBUG
313
    fprintf(stderr, "OPENSSL_INIT: ossl_init_async: async_init()\n");
314
#endif
315
0
    if (!async_init())
316
0
        return 0;
317
0
    async_inited = 1;
318
0
    return 1;
319
0
}
320
321
#ifndef OPENSSL_NO_ENGINE
322
static CRYPTO_ONCE engine_openssl = CRYPTO_ONCE_STATIC_INIT;
323
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_openssl)
324
0
{
325
# ifdef OPENSSL_INIT_DEBUG
326
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_openssl: "
327
                    "engine_load_openssl_int()\n");
328
# endif
329
0
    engine_load_openssl_int();
330
0
    return 1;
331
0
}
332
# ifndef OPENSSL_NO_DEVCRYPTOENG
333
static CRYPTO_ONCE engine_devcrypto = CRYPTO_ONCE_STATIC_INIT;
334
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_devcrypto)
335
{
336
#  ifdef OPENSSL_INIT_DEBUG
337
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_devcrypto: "
338
                    "engine_load_devcrypto_int()\n");
339
#  endif
340
    engine_load_devcrypto_int();
341
    return 1;
342
}
343
# endif
344
345
# ifndef OPENSSL_NO_RDRAND
346
static CRYPTO_ONCE engine_rdrand = CRYPTO_ONCE_STATIC_INIT;
347
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_rdrand)
348
2
{
349
#  ifdef OPENSSL_INIT_DEBUG
350
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_rdrand: "
351
                    "engine_load_rdrand_int()\n");
352
#  endif
353
2
    engine_load_rdrand_int();
354
2
    return 1;
355
2
}
356
# endif
357
static CRYPTO_ONCE engine_dynamic = CRYPTO_ONCE_STATIC_INIT;
358
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_dynamic)
359
2
{
360
# ifdef OPENSSL_INIT_DEBUG
361
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_dynamic: "
362
                    "engine_load_dynamic_int()\n");
363
# endif
364
2
    engine_load_dynamic_int();
365
2
    return 1;
366
2
}
367
# ifndef OPENSSL_NO_STATIC_ENGINE
368
#  if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK)
369
static CRYPTO_ONCE engine_padlock = CRYPTO_ONCE_STATIC_INIT;
370
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_padlock)
371
{
372
#   ifdef OPENSSL_INIT_DEBUG
373
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_padlock: "
374
                    "engine_load_padlock_int()\n");
375
#   endif
376
    engine_load_padlock_int();
377
    return 1;
378
}
379
#  endif
380
#  if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG)
381
static CRYPTO_ONCE engine_capi = CRYPTO_ONCE_STATIC_INIT;
382
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_capi)
383
{
384
#   ifdef OPENSSL_INIT_DEBUG
385
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_capi: "
386
                    "engine_load_capi_int()\n");
387
#   endif
388
    engine_load_capi_int();
389
    return 1;
390
}
391
#  endif
392
#  if !defined(OPENSSL_NO_AFALGENG)
393
static CRYPTO_ONCE engine_afalg = CRYPTO_ONCE_STATIC_INIT;
394
DEFINE_RUN_ONCE_STATIC(ossl_init_engine_afalg)
395
{
396
#   ifdef OPENSSL_INIT_DEBUG
397
    fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_afalg: "
398
                    "engine_load_afalg_int()\n");
399
#   endif
400
    engine_load_afalg_int();
401
    return 1;
402
}
403
#  endif
404
# endif
405
#endif
406
407
#ifndef OPENSSL_NO_COMP
408
static CRYPTO_ONCE zlib = CRYPTO_ONCE_STATIC_INIT;
409
410
static int zlib_inited = 0;
411
DEFINE_RUN_ONCE_STATIC(ossl_init_zlib)
412
{
413
    /* Do nothing - we need to know about this for the later cleanup */
414
    zlib_inited = 1;
415
    return 1;
416
}
417
#endif
418
419
static void ossl_init_thread_stop(struct thread_local_inits_st *locals)
420
2
{
421
    /* Can't do much about this */
422
2
    if (locals == NULL)
423
0
        return;
424
425
2
    if (locals->async) {
426
#ifdef OPENSSL_INIT_DEBUG
427
        fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: "
428
                        "async_delete_thread_state()\n");
429
#endif
430
0
        async_delete_thread_state();
431
0
    }
432
433
2
    if (locals->err_state) {
434
#ifdef OPENSSL_INIT_DEBUG
435
        fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: "
436
                        "err_delete_thread_state()\n");
437
#endif
438
2
        err_delete_thread_state();
439
2
    }
440
441
2
    if (locals->rand) {
442
#ifdef OPENSSL_INIT_DEBUG
443
        fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: "
444
                        "drbg_delete_thread_state()\n");
445
#endif
446
1
        drbg_delete_thread_state();
447
1
    }
448
449
2
    OPENSSL_free(locals);
450
2
}
451
452
void OPENSSL_thread_stop(void)
453
0
{
454
0
    if (destructor_key.sane != -1)
455
0
        ossl_init_thread_stop(ossl_init_get_thread_local(0));
456
0
}
457
458
int ossl_init_thread_start(uint64_t opts)
459
4
{
460
4
    struct thread_local_inits_st *locals;
461
462
4
    if (!OPENSSL_init_crypto(0, NULL))
463
0
        return 0;
464
465
4
    locals = ossl_init_get_thread_local(1);
466
467
4
    if (locals == NULL)
468
0
        return 0;
469
470
4
    if (opts & OPENSSL_INIT_THREAD_ASYNC) {
471
#ifdef OPENSSL_INIT_DEBUG
472
        fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: "
473
                        "marking thread for async\n");
474
#endif
475
0
        locals->async = 1;
476
0
    }
477
478
4
    if (opts & OPENSSL_INIT_THREAD_ERR_STATE) {
479
#ifdef OPENSSL_INIT_DEBUG
480
        fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: "
481
                        "marking thread for err_state\n");
482
#endif
483
2
        locals->err_state = 1;
484
2
    }
485
486
4
    if (opts & OPENSSL_INIT_THREAD_RAND) {
487
#ifdef OPENSSL_INIT_DEBUG
488
        fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: "
489
                        "marking thread for rand\n");
490
#endif
491
2
        locals->rand = 1;
492
2
    }
493
494
4
    return 1;
495
4
}
496
497
void OPENSSL_cleanup(void)
498
2
{
499
2
    OPENSSL_INIT_STOP *currhandler, *lasthandler;
500
2
    CRYPTO_THREAD_LOCAL key;
501
502
    /* If we've not been inited then no need to deinit */
503
2
    if (!base_inited)
504
0
        return;
505
506
    /* Might be explicitly called and also by atexit */
507
2
    if (stopped)
508
0
        return;
509
2
    stopped = 1;
510
511
    /*
512
     * Thread stop may not get automatically called by the thread library for
513
     * the very last thread in some situations, so call it directly.
514
     */
515
2
    ossl_init_thread_stop(ossl_init_get_thread_local(0));
516
517
2
    currhandler = stop_handlers;
518
4
    while (currhandler != NULL) {
519
2
        currhandler->handler();
520
2
        lasthandler = currhandler;
521
2
        currhandler = currhandler->next;
522
2
        OPENSSL_free(lasthandler);
523
2
    }
524
2
    stop_handlers = NULL;
525
526
2
    CRYPTO_THREAD_lock_free(init_lock);
527
2
    init_lock = NULL;
528
529
    /*
530
     * We assume we are single-threaded for this function, i.e. no race
531
     * conditions for the various "*_inited" vars below.
532
     */
533
534
#ifndef OPENSSL_NO_COMP
535
    if (zlib_inited) {
536
#ifdef OPENSSL_INIT_DEBUG
537
        fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
538
                        "comp_zlib_cleanup_int()\n");
539
#endif
540
        comp_zlib_cleanup_int();
541
    }
542
#endif
543
544
2
    if (async_inited) {
545
# ifdef OPENSSL_INIT_DEBUG
546
        fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
547
                        "async_deinit()\n");
548
# endif
549
0
        async_deinit();
550
0
    }
551
552
2
    if (load_crypto_strings_inited) {
553
#ifdef OPENSSL_INIT_DEBUG
554
        fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
555
                        "err_free_strings_int()\n");
556
#endif
557
2
        err_free_strings_int();
558
2
    }
559
560
2
    key = destructor_key.value;
561
2
    destructor_key.sane = -1;
562
2
    CRYPTO_THREAD_cleanup_local(&key);
563
564
#ifdef OPENSSL_INIT_DEBUG
565
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
566
                    "rand_cleanup_int()\n");
567
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
568
                    "conf_modules_free_int()\n");
569
#ifndef OPENSSL_NO_ENGINE
570
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
571
                    "engine_cleanup_int()\n");
572
#endif
573
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
574
                    "crypto_cleanup_all_ex_data_int()\n");
575
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
576
                    "bio_sock_cleanup_int()\n");
577
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
578
                    "bio_cleanup()\n");
579
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
580
                    "evp_cleanup_int()\n");
581
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
582
                    "obj_cleanup_int()\n");
583
    fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
584
                    "err_cleanup()\n");
585
#endif
586
    /*
587
     * Note that cleanup order is important:
588
     * - rand_cleanup_int could call an ENGINE's RAND cleanup function so
589
     * must be called before engine_cleanup_int()
590
     * - ENGINEs use CRYPTO_EX_DATA and therefore, must be cleaned up
591
     * before the ex data handlers are wiped in CRYPTO_cleanup_all_ex_data().
592
     * - conf_modules_free_int() can end up in ENGINE code so must be called
593
     * before engine_cleanup_int()
594
     * - ENGINEs and additional EVP algorithms might use added OIDs names so
595
     * obj_cleanup_int() must be called last
596
     */
597
2
    rand_cleanup_int();
598
2
    rand_drbg_cleanup_int();
599
2
    conf_modules_free_int();
600
2
#ifndef OPENSSL_NO_ENGINE
601
2
    engine_cleanup_int();
602
2
#endif
603
2
    ossl_store_cleanup_int();
604
2
    crypto_cleanup_all_ex_data_int();
605
2
    bio_cleanup();
606
2
    evp_cleanup_int();
607
2
    obj_cleanup_int();
608
2
    err_cleanup();
609
610
2
    CRYPTO_secure_malloc_done();
611
612
2
    base_inited = 0;
613
2
}
614
615
/*
616
 * If this function is called with a non NULL settings value then it must be
617
 * called prior to any threads making calls to any OpenSSL functions,
618
 * i.e. passing a non-null settings value is assumed to be single-threaded.
619
 */
620
int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
621
645k
{
622
645k
    if (stopped) {
623
0
        if (!(opts & OPENSSL_INIT_BASE_ONLY))
624
0
            CRYPTOerr(CRYPTO_F_OPENSSL_INIT_CRYPTO, ERR_R_INIT_FAIL);
625
0
        return 0;
626
0
    }
627
628
    /*
629
     * When the caller specifies OPENSSL_INIT_BASE_ONLY, that should be the
630
     * *only* option specified.  With that option we return immediately after
631
     * doing the requested limited initialization.  Note that
632
     * err_shelve_state() called by us via ossl_init_load_crypto_nodelete()
633
     * re-enters OPENSSL_init_crypto() with OPENSSL_INIT_BASE_ONLY, but with
634
     * base already initialized this is a harmless NOOP.
635
     *
636
     * If we remain the only caller of err_shelve_state() the recursion should
637
     * perhaps be removed, but if in doubt, it can be left in place.
638
     */
639
645k
    if (!RUN_ONCE(&base, ossl_init_base))
640
0
        return 0;
641
645k
    if (opts & OPENSSL_INIT_BASE_ONLY)
642
358k
        return 1;
643
644
    /*
645
     * Now we don't always set up exit handlers, the INIT_BASE_ONLY calls
646
     * should not have the side-effect of setting up exit handlers, and
647
     * therefore, this code block is below the INIT_BASE_ONLY-conditioned early
648
     * return above.
649
     */
650
286k
    if ((opts & OPENSSL_INIT_NO_ATEXIT) != 0) {
651
0
        if (!RUN_ONCE_ALT(&register_atexit, ossl_init_no_register_atexit,
652
0
                          ossl_init_register_atexit))
653
0
            return 0;
654
286k
    } else if (!RUN_ONCE(&register_atexit, ossl_init_register_atexit)) {
655
0
        return 0;
656
0
    }
657
658
286k
    if (!RUN_ONCE(&load_crypto_nodelete, ossl_init_load_crypto_nodelete))
659
0
        return 0;
660
661
286k
    if ((opts & OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS)
662
286k
            && !RUN_ONCE_ALT(&load_crypto_strings,
663
286k
                             ossl_init_no_load_crypto_strings,
664
286k
                             ossl_init_load_crypto_strings))
665
0
        return 0;
666
667
286k
    if ((opts & OPENSSL_INIT_LOAD_CRYPTO_STRINGS)
668
286k
            && !RUN_ONCE(&load_crypto_strings, ossl_init_load_crypto_strings))
669
0
        return 0;
670
671
286k
    if ((opts & OPENSSL_INIT_NO_ADD_ALL_CIPHERS)
672
286k
            && !RUN_ONCE_ALT(&add_all_ciphers, ossl_init_no_add_all_ciphers,
673
286k
                             ossl_init_add_all_ciphers))
674
0
        return 0;
675
676
286k
    if ((opts & OPENSSL_INIT_ADD_ALL_CIPHERS)
677
286k
            && !RUN_ONCE(&add_all_ciphers, ossl_init_add_all_ciphers))
678
0
        return 0;
679
680
286k
    if ((opts & OPENSSL_INIT_NO_ADD_ALL_DIGESTS)
681
286k
            && !RUN_ONCE_ALT(&add_all_digests, ossl_init_no_add_all_digests,
682
286k
                             ossl_init_add_all_digests))
683
0
        return 0;
684
685
286k
    if ((opts & OPENSSL_INIT_ADD_ALL_DIGESTS)
686
286k
            && !RUN_ONCE(&add_all_digests, ossl_init_add_all_digests))
687
0
        return 0;
688
689
286k
    if ((opts & OPENSSL_INIT_ATFORK)
690
286k
            && !openssl_init_fork_handlers())
691
0
        return 0;
692
693
286k
    if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG)
694
286k
            && !RUN_ONCE_ALT(&config, ossl_init_no_config, ossl_init_config))
695
0
        return 0;
696
697
286k
    if (opts & OPENSSL_INIT_LOAD_CONFIG) {
698
143k
        int ret;
699
143k
        CRYPTO_THREAD_write_lock(init_lock);
700
143k
        conf_settings = settings;
701
143k
        ret = RUN_ONCE(&config, ossl_init_config);
702
143k
        conf_settings = NULL;
703
143k
        CRYPTO_THREAD_unlock(init_lock);
704
143k
        if (ret <= 0)
705
0
            return 0;
706
143k
    }
707
708
286k
    if ((opts & OPENSSL_INIT_ASYNC)
709
286k
            && !RUN_ONCE(&async, ossl_init_async))
710
0
        return 0;
711
712
286k
#ifndef OPENSSL_NO_ENGINE
713
286k
    if ((opts & OPENSSL_INIT_ENGINE_OPENSSL)
714
286k
            && !RUN_ONCE(&engine_openssl, ossl_init_engine_openssl))
715
0
        return 0;
716
# if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_DEVCRYPTOENG)
717
    if ((opts & OPENSSL_INIT_ENGINE_CRYPTODEV)
718
            && !RUN_ONCE(&engine_devcrypto, ossl_init_engine_devcrypto))
719
        return 0;
720
# endif
721
286k
# ifndef OPENSSL_NO_RDRAND
722
286k
    if ((opts & OPENSSL_INIT_ENGINE_RDRAND)
723
286k
            && !RUN_ONCE(&engine_rdrand, ossl_init_engine_rdrand))
724
0
        return 0;
725
286k
# endif
726
286k
    if ((opts & OPENSSL_INIT_ENGINE_DYNAMIC)
727
286k
            && !RUN_ONCE(&engine_dynamic, ossl_init_engine_dynamic))
728
0
        return 0;
729
286k
# ifndef OPENSSL_NO_STATIC_ENGINE
730
#  if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK)
731
    if ((opts & OPENSSL_INIT_ENGINE_PADLOCK)
732
            && !RUN_ONCE(&engine_padlock, ossl_init_engine_padlock))
733
        return 0;
734
#  endif
735
#  if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG)
736
    if ((opts & OPENSSL_INIT_ENGINE_CAPI)
737
            && !RUN_ONCE(&engine_capi, ossl_init_engine_capi))
738
        return 0;
739
#  endif
740
#  if !defined(OPENSSL_NO_AFALGENG)
741
    if ((opts & OPENSSL_INIT_ENGINE_AFALG)
742
            && !RUN_ONCE(&engine_afalg, ossl_init_engine_afalg))
743
        return 0;
744
#  endif
745
286k
# endif
746
286k
    if (opts & (OPENSSL_INIT_ENGINE_ALL_BUILTIN
747
286k
                | OPENSSL_INIT_ENGINE_OPENSSL
748
286k
                | OPENSSL_INIT_ENGINE_AFALG)) {
749
2
        ENGINE_register_all_complete();
750
2
    }
751
286k
#endif
752
753
#ifndef OPENSSL_NO_COMP
754
    if ((opts & OPENSSL_INIT_ZLIB)
755
            && !RUN_ONCE(&zlib, ossl_init_zlib))
756
        return 0;
757
#endif
758
759
286k
    return 1;
760
286k
}
761
762
int OPENSSL_atexit(void (*handler)(void))
763
2
{
764
2
    OPENSSL_INIT_STOP *newhand;
765
766
#if !defined(OPENSSL_USE_NODELETE)\
767
    && !defined(OPENSSL_NO_PINSHARED)
768
    {
769
        union {
770
            void *sym;
771
            void (*func)(void);
772
        } handlersym;
773
774
        handlersym.func = handler;
775
# if defined(DSO_WIN32) && !defined(_WIN32_WCE)
776
        {
777
            HMODULE handle = NULL;
778
            BOOL ret;
779
780
            /*
781
             * We don't use the DSO route for WIN32 because there is a better
782
             * way
783
             */
784
            ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
785
                                    | GET_MODULE_HANDLE_EX_FLAG_PIN,
786
                                    handlersym.sym, &handle);
787
788
            if (!ret)
789
                return 0;
790
        }
791
# elif !defined(DSO_NONE)
792
        /*
793
         * Deliberately leak a reference to the handler. This will force the
794
         * library/code containing the handler to remain loaded until we run the
795
         * atexit handler. If -znodelete has been used then this is
796
         * unnecessary.
797
         */
798
        {
799
            DSO *dso = NULL;
800
801
            ERR_set_mark();
802
            dso = DSO_dsobyaddr(handlersym.sym, DSO_FLAG_NO_UNLOAD_ON_FREE);
803
#  ifdef OPENSSL_INIT_DEBUG
804
            fprintf(stderr,
805
                    "OPENSSL_INIT: OPENSSL_atexit: obtained DSO reference? %s\n",
806
                    (dso == NULL ? "No!" : "Yes."));
807
            /* See same code above in ossl_init_base() for an explanation. */
808
#  endif
809
            DSO_free(dso);
810
            ERR_pop_to_mark();
811
        }
812
# endif
813
    }
814
#endif
815
816
2
    if ((newhand = OPENSSL_malloc(sizeof(*newhand))) == NULL) {
817
0
        CRYPTOerr(CRYPTO_F_OPENSSL_ATEXIT, ERR_R_MALLOC_FAILURE);
818
0
        return 0;
819
0
    }
820
821
2
    newhand->handler = handler;
822
2
    newhand->next = stop_handlers;
823
2
    stop_handlers = newhand;
824
825
2
    return 1;
826
2
}
827
828
#ifdef OPENSSL_SYS_UNIX
829
/*
830
 * The following three functions are for OpenSSL developers.  This is
831
 * where we set/reset state across fork (called via pthread_atfork when
832
 * it exists, or manually by the application when it doesn't).
833
 *
834
 * WARNING!  If you put code in either OPENSSL_fork_parent or
835
 * OPENSSL_fork_child, you MUST MAKE SURE that they are async-signal-
836
 * safe.  See this link, for example:
837
 *      http://man7.org/linux/man-pages/man7/signal-safety.7.html
838
 */
839
840
void OPENSSL_fork_prepare(void)
841
0
{
842
0
}
843
844
void OPENSSL_fork_parent(void)
845
0
{
846
0
}
847
848
void OPENSSL_fork_child(void)
849
0
{
850
0
}
851
#endif