107
107
* some other function while holding a lock make sure you know whether it
108
108
* will make any upcalls or not. For example ossl_provider_up_ref() can call
109
109
* ossl_provider_up_ref_parent() which can call the c_prov_up_ref() upcall.
110
- * - It is permissible to hold the store lock when calling child provider
111
- * callbacks. No other locks may be held during such callbacks.
110
+ * - It is permissible to hold the store and flag locks when calling child
111
+ * provider callbacks. No other locks may be held during such callbacks.
112
112
*/
113
113
114
114
static OSSL_PROVIDER * provider_new (const char * name ,
@@ -1058,9 +1058,6 @@ static int provider_deactivate(OSSL_PROVIDER *prov, int upcalls,
1058
1058
removechildren = 0 ;
1059
1059
#endif
1060
1060
1061
- if (lock )
1062
- CRYPTO_THREAD_unlock (prov -> flag_lock );
1063
-
1064
1061
#ifndef FIPS_MODULE
1065
1062
if (removechildren && store != NULL ) {
1066
1063
int i , max = sk_OSSL_PROVIDER_CHILD_CB_num (store -> child_cbs );
@@ -1072,8 +1069,10 @@ static int provider_deactivate(OSSL_PROVIDER *prov, int upcalls,
1072
1069
}
1073
1070
}
1074
1071
#endif
1075
- if (lock )
1072
+ if (lock ) {
1073
+ CRYPTO_THREAD_unlock (prov -> flag_lock );
1076
1074
CRYPTO_THREAD_unlock (store -> lock );
1075
+ }
1077
1076
#ifndef FIPS_MODULE
1078
1077
if (freeparent )
1079
1078
ossl_provider_free_parent (prov , 1 );
@@ -1091,7 +1090,7 @@ static int provider_activate(OSSL_PROVIDER *prov, int lock, int upcalls)
1091
1090
{
1092
1091
int count = -1 ;
1093
1092
struct provider_store_st * store ;
1094
- int ret = 1 , createchildren = 0 ;
1093
+ int ret = 1 ;
1095
1094
1096
1095
store = prov -> store ;
1097
1096
/*
@@ -1129,15 +1128,13 @@ static int provider_activate(OSSL_PROVIDER *prov, int lock, int upcalls)
1129
1128
count = ++ prov -> activatecnt ;
1130
1129
prov -> flag_activated = 1 ;
1131
1130
1132
- if (prov -> activatecnt == 1 && store != NULL )
1133
- createchildren = 1 ;
1134
-
1135
- if (lock )
1136
- CRYPTO_THREAD_unlock (prov -> flag_lock );
1137
- if (createchildren )
1131
+ if (prov -> activatecnt == 1 && store != NULL ) {
1138
1132
ret = create_provider_children (prov );
1139
- if (lock )
1133
+ }
1134
+ if (lock ) {
1135
+ CRYPTO_THREAD_unlock (prov -> flag_lock );
1140
1136
CRYPTO_THREAD_unlock (store -> lock );
1137
+ }
1141
1138
1142
1139
if (!ret )
1143
1140
return -1 ;
0 commit comments