Skip to content

Commit 63e2e40

Browse files
committed
Centralize atexit(pkcs11_*_method_free)
1 parent 03bb603 commit 63e2e40

5 files changed

Lines changed: 51 additions & 42 deletions

File tree

src/libp11-int.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,6 @@ extern PKCS11_OBJECT_ops pkcs11_ed448_ops;
130130
# endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L */
131131
#endif /* OPENSSL_NO_EC */
132132

133-
extern int pkcs11_global_data_refs;
134-
135133
/*
136134
* Internal functions
137135
*/

src/p11_ec.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -809,14 +809,13 @@ EC_KEY_METHOD *PKCS11_get_ec_key_method(void)
809809
EC_KEY_METHOD_set_sign(pkcs11_ec_key_method, orig_sign, NULL, pkcs11_ecdsa_sign_sig);
810810
EC_KEY_METHOD_get_compute_key(pkcs11_ec_key_method, &ossl_ecdh_compute_key);
811811
EC_KEY_METHOD_set_compute_key(pkcs11_ec_key_method, pkcs11_ec_ckey);
812-
atexit(pkcs11_ec_key_method_free);
813812
}
814813
return pkcs11_ec_key_method;
815814
}
816815

817816
void pkcs11_ec_key_method_free(void)
818817
{
819-
if (pkcs11_global_data_refs == 0 && pkcs11_ec_key_method) {
818+
if (pkcs11_ec_key_method) {
820819
free_ec_ex_index();
821820
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
822821
if (meth->pkcs11_ecdh_method & EC_KEY_METHOD_DYNAMIC)
@@ -853,14 +852,13 @@ ECDSA_METHOD *PKCS11_get_ecdsa_method(void)
853852
alloc_ec_ex_index();
854853
pkcs11_ecdsa_method = ECDSA_METHOD_new((ECDSA_METHOD *)ECDSA_OpenSSL());
855854
ECDSA_METHOD_set_sign(pkcs11_ecdsa_method, pkcs11_ecdsa_sign_sig);
856-
atexit(pkcs11_ecdsa_method_free);
857855
}
858856
return pkcs11_ecdsa_method;
859857
}
860858

861859
void pkcs11_ecdsa_method_free(void)
862860
{
863-
if (pkcs11_global_data_refs == 0 && pkcs11_ecdsa_method) {
861+
if (pkcs11_ecdsa_method) {
864862
free_ec_ex_index();
865863
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
866864
if (pkcs11_ecdsa_method->flags & EC_KEY_METHOD_DYNAMIC)
@@ -879,14 +877,13 @@ ECDH_METHOD *PKCS11_get_ecdh_method(void)
879877
pkcs11_ecdh_method = ECDH_METHOD_new((ECDH_METHOD *)ECDH_OpenSSL());
880878
ECDH_METHOD_get_compute_key(pkcs11_ecdh_method, &ossl_ecdh_compute_key);
881879
ECDH_METHOD_set_compute_key(pkcs11_ecdh_method, pkcs11_ec_ckey);
882-
atexit(pkcs11_ecdh_method_free);
883880
}
884881
return pkcs11_ecdh_method;
885882
}
886883

887884
void pkcs11_ecdh_method_free(void)
888885
{
889-
if (pkcs11_global_data_refs == 0 && pkcs11_ecdh_method) {
886+
if (pkcs11_ecdh_method) {
890887
free_ec_ex_index();
891888
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
892889
if (pkcs11_ecdh_method->flags & EC_KEY_METHOD_DYNAMIC)

src/p11_eddsa.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,8 @@ void pkcs11_ed448_method_free(void)
321321

322322
void pkcs11_ed_key_method_free(void)
323323
{
324-
if (pkcs11_global_data_refs == 0) {
325-
pkcs11_ed25519_method_free();
326-
pkcs11_ed448_method_free();
327-
}
324+
pkcs11_ed25519_method_free();
325+
pkcs11_ed448_method_free();
328326
}
329327

330328
#endif /* OPENSSL_VERSION_NUMBER < 0x40000000L */
@@ -608,7 +606,6 @@ static EVP_PKEY *pkcs11_get_evp_key_ed25519(PKCS11_OBJECT_private *key)
608606
#if OPENSSL_VERSION_NUMBER < 0x40000000L
609607
alloc_pkey_ex_index();
610608
pkcs11_set_ex_data_pkey(pkey, key);
611-
atexit(pkcs11_ed25519_method_free);
612609
#endif /* OPENSSL_VERSION_NUMBER < 0x40000000L */
613610
}
614611
return pkey;
@@ -645,7 +642,6 @@ static EVP_PKEY *pkcs11_get_evp_key_ed448(PKCS11_OBJECT_private *key)
645642
#if OPENSSL_VERSION_NUMBER < 0x40000000L
646643
alloc_pkey_ex_index();
647644
pkcs11_set_ex_data_pkey(pkey, key);
648-
atexit(pkcs11_ed448_method_free);
649645
#endif /* OPENSSL_VERSION_NUMBER < 0x40000000L */
650646
}
651647
return pkey;

src/p11_load.c

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,46 @@
2121
#include <string.h>
2222

2323
/* Global number of active PKCS11_CTX objects */
24-
int pkcs11_global_data_refs = 0;
24+
static int pkcs11_global_data_refs = 0;
25+
26+
/*
27+
* Free global ex_data indexes and methods
28+
*/
29+
static void libp11_global_free()
30+
{
31+
#ifndef OPENSSL_NO_RSA
32+
pkcs11_rsa_method_free();
33+
#endif
34+
#if OPENSSL_VERSION_NUMBER >= 0x10100002L
35+
#ifndef OPENSSL_NO_EC
36+
pkcs11_ec_key_method_free();
37+
# if OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L
38+
pkcs11_ed_key_method_free();
39+
# endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L */
40+
#endif /* OPENSSL_NO_EC */
41+
#else /* OPENSSL_VERSION_NUMBER */
42+
#ifndef OPENSSL_NO_ECDSA
43+
pkcs11_ecdsa_method_free();
44+
#endif /* OPENSSL_NO_ECDSA */
45+
#ifndef OPENSSL_NO_ECDH
46+
pkcs11_ecdh_method_free();
47+
#endif /* OPENSSL_NO_ECDH */
48+
# if OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L
49+
pkcs11_rsa_key_method_free();
50+
# endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L */
51+
#endif /* OPENSSL_VERSION_NUMBER */
52+
}
53+
54+
/*
55+
* Free global data if some PKCS11_CTX objects were not freed by the user
56+
*/
57+
static void libp11_atexit()
58+
{
59+
if (pkcs11_global_data_refs > 0) {
60+
pkcs11_global_data_refs = 0;
61+
libp11_global_free();
62+
}
63+
}
2564

2665
/*
2766
* Create a new context
@@ -46,7 +85,8 @@ PKCS11_CTX *pkcs11_CTX_new(void)
4685
cpriv->forkid = get_forkid();
4786
pthread_mutex_init(&cpriv->fork_lock, 0);
4887

49-
pkcs11_global_data_refs++;
88+
if(pkcs11_global_data_refs++ == 0)
89+
atexit(libp11_atexit);
5090

5191
return ctx;
5292
fail:
@@ -177,28 +217,8 @@ void pkcs11_CTX_free(PKCS11_CTX *ctx)
177217
OPENSSL_free(ctx->_private);
178218
OPENSSL_free(ctx);
179219

180-
pkcs11_global_data_refs--;
181-
#ifndef OPENSSL_NO_RSA
182-
pkcs11_rsa_method_free();
183-
#endif
184-
#if OPENSSL_VERSION_NUMBER >= 0x10100002L
185-
#ifndef OPENSSL_NO_EC
186-
pkcs11_ec_key_method_free();
187-
# if OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L
188-
pkcs11_ed_key_method_free();
189-
# endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L */
190-
#endif /* OPENSSL_NO_EC */
191-
#else /* OPENSSL_VERSION_NUMBER */
192-
#ifndef OPENSSL_NO_ECDSA
193-
pkcs11_ecdsa_method_free();
194-
#endif /* OPENSSL_NO_ECDSA */
195-
#ifndef OPENSSL_NO_ECDH
196-
pkcs11_ecdh_method_free();
197-
#endif /* OPENSSL_NO_ECDH */
198-
# if OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L
199-
pkcs11_rsa_key_method_free();
200-
# endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L */
201-
#endif /* OPENSSL_VERSION_NUMBER */
220+
if (--pkcs11_global_data_refs == 0)
221+
libp11_global_free();
202222
}
203223

204224
/* vim: set noexpandtab: */

src/p11_rsa.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ static int pkcs11_pkey_method_rsa_new(void)
314314

315315
void pkcs11_rsa_key_method_free(void)
316316
{
317-
if (pkcs11_global_data_refs == 0 && pkey_method_rsa) {
317+
if (pkey_method_rsa) {
318318
free_pkey_ex_index();
319319
EVP_PKEY_meth_remove(pkey_method_rsa);
320320
EVP_PKEY_meth_free(pkey_method_rsa);
@@ -355,7 +355,6 @@ static EVP_PKEY *pkcs11_get_evp_key_rsa(PKCS11_OBJECT_private *key)
355355
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L
356356
alloc_pkey_ex_index();
357357
pkcs11_set_ex_data_pkey(pk, key);
358-
atexit(pkcs11_rsa_key_method_free);
359358
#endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L && OPENSSL_VERSION_NUMBER < 0x40000000L */
360359

361360
RSA_set_method(rsa, PKCS11_get_rsa_method());
@@ -604,14 +603,13 @@ RSA_METHOD *PKCS11_get_rsa_method(void)
604603
RSA_meth_set_priv_enc(pkcs11_rsa_method, pkcs11_rsa_priv_enc_method);
605604
RSA_meth_set_priv_dec(pkcs11_rsa_method, pkcs11_rsa_priv_dec_method);
606605
RSA_meth_set_finish(pkcs11_rsa_method, pkcs11_rsa_free_method);
607-
atexit(pkcs11_rsa_method_free);
608606
}
609607
return pkcs11_rsa_method;
610608
}
611609

612610
void pkcs11_rsa_method_free(void)
613611
{
614-
if (pkcs11_global_data_refs == 0 && pkcs11_rsa_method) {
612+
if (pkcs11_rsa_method) {
615613
free_rsa_ex_index();
616614
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
617615
RSA_meth_free(pkcs11_rsa_method);

0 commit comments

Comments
 (0)