diff -up openssl-3.0.0-alpha16/crypto/init.c.softhsm openssl-3.0.0-alpha16/crypto/init.c --- openssl-3.0.0-alpha16/crypto/init.c.softhsm 2021-06-04 09:40:22.637748149 +0200 +++ openssl-3.0.0-alpha16/crypto/init.c 2021-06-04 09:44:09.695867437 +0200 @@ -454,6 +454,13 @@ int OPENSSL_init_crypto(uint64_t opts, c uint64_t tmp; int aloaddone = 0; + /* Applications depend on 0 being returned when cleanup was already done */ + if (stopped) { + if (!(opts & OPENSSL_INIT_BASE_ONLY)) + ERR_raise(ERR_LIB_CRYPTO, ERR_R_INIT_FAIL); + return 0; + } + /* * We ignore failures from this function. It is probably because we are * on a platform that doesn't support lockless atomic loads (we may not @@ -476,15 +483,7 @@ int OPENSSL_init_crypto(uint64_t opts, c /* * At some point we should look at this function with a view to moving * most/all of this into OSSL_LIB_CTX. - */ - - if (stopped) { - if (!(opts & OPENSSL_INIT_BASE_ONLY)) - ERR_raise(ERR_LIB_CRYPTO, ERR_R_INIT_FAIL); - return 0; - } - - /* + * * When the caller specifies OPENSSL_INIT_BASE_ONLY, that should be the * *only* option specified. With that option we return immediately after * doing the requested limited initialization. Note that