On Wed, Feb 5, 2025 at 9:13 AM Ruediger Pluem <rpl...@apache.org> wrote: > > Just to draw a bit of attention to > https://bz.apache.org/bugzilla/show_bug.cgi?id=69561 > > Is it possible that we need to ensure that at least some of the init actions > in ssl_init_Module in ssl_engine_init.c are only > executed once by guarding them with an check to > ap_state_query(AP_SQ_MAIN_STATE) and either do them in > AP_SQ_MS_CREATE_PRE_CONFIG or AP_SQ_MS_CREATE_CONFIG state?
Even if we do initialize once at startup this could still reproduce at restart where the (almost) very same DSO-unload+cleanup then DSO-load+init happens? We don't do anything fancy to initialize openssl >= 3.0, just call OPENSSL_init_ssl() anytime the mod_ssl DSO is loaded, and this is supposed to do the right thing automagically when the DSO gets unloaded (and supposedly reloaded+OPENSSL_init_ssl() again..). The crash in BZ-69561 does not originate from our own ssl_hook_pre_config::OPENSSL_init_ssl() though, but from ssl_init_ctx_protocol::SSL_CTX_new_ex()::OPENSSL_init_ssl() because this call uses OPENSSL_INIT_LOAD_SSL_STRINGS (while ours only uses OPENSSL_INIT_ENGINE_ALL_BUILTIN), and it seems that (re)initializing the SSL error strings is what makes the crash happen somehow. Maybe we could use ssl_hook_pre_config::OPENSSL_init_ssl(OPENSSL_INIT_ENGINE_ALL_BUILTIN|OPENSSL_INIT_LOAD_SSL_STRINGS) to noop the second call and see if it crashes in our own call now (likely). Something seems to have broken in openssl 3.4 internally regarding DSO loading/unloading and cleanups, but it does not jump out at me when looking at the changes between 3.3.2 and 3.4, nothing related it seems in the ssl_init(.c) code where only compression methods initialization moved elsewhere, but quite some changes in the threads code (and thread local storage) which is possibly how/where some internal init/deinit state is tracked too (at least functions supposed to be called once are tracked like this, which might be inconsistent with states tracked by global static variables reset by DSO unload+reload). This needs some debugging on windows, which I won't be able to do. We need to see if OPENSSL_cleanup() is called when mod_ssl is unloaded+reloaded, and why reentering ossl_init_load_ssl_strings() on reload goes havoc.. On linux it does not work the same by default for me, on my system libssl is pinned (meaning dlclose() is a noop so never unloaded), only the first call to OPENSSL_init_ssl() does something, and OPENSSL_cleanup() is called when httpd is exit()ing only. So I tried to build an openssl-3.4 myself with no-pinshared to remove the pinning, so that it runs by really loading/unloading libssl with mod_ssl like on windows, but this bug does not reproduce on linux so it's probably windows specific :/ Regards; Yann.