[erlang-bugs] Unloading then reloading crypto.so causes erlang core dump on Solaris 11

Sverker Eriksson <>
Thu Sep 6 18:27:44 CEST 2012

XinFeng Liu wrote:
> Hi,
> I'm trying CouchDB (version 1.2) on Solaris 11 Sparc, but running CouchDB 
> testsuite in browser caused erlang process core dumped. I tried both erlang 
> 14B04 and 15B01.
> After investigation, I found it occurred when couchDB restarted itself. During 
> restarting, erlang unloaded crypto.so then reloaded it into a different address, 
> but openssl library libcrypto.so still using the old call back address 
> of  crypto_alloc() in lib/crypto/c_src/crypto.c. In fact, crypto_alloc() is 
> shown as a local function from "nm" command.
> The temporary workaround is modifying crypto.c:
> replace   CRYPTO_set_mem_functions(crypto_alloc, crypto_realloc, crypto_free);
> to:
>              CRYPTO_set_mem_functions(enif_alloc, enif_realloc, enif_free);
> I'm not sure it is erlang bug or bug of openssl  for solaris, please help clarify?
This is crypto trying to do something which openssl does not support.

The workaround you suggested using enif_alloc instead of crypto_alloc 
seems like a good start if it solves your problem. There are however 
other callbacks for locking (see CRYPTO_set_locking_callback) that maybe 
could cause the same kind of problem.

The root problem is that openssl does not support "unregistering" of 
callbacks. The solution is probably some feature that would allow a NIF 
library to be kept in memory and be reused if/when the erlang module is 
loaded again.

XinFeng Liu wrote:
> I also tried another workaround in lib/crypto/c_src/crypto.c:
> add
> CRYPTO_set_mem_functions(crypto_alloc, crypto_realloc, crypto_free);
> in reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) before 
> "return 0;"
> The couchDB testsuite runs fine.
> Is this way O.K.?
This I don't understand at all.
reload() in crypto.c should only be called if the module is upgraded, 
not if it is unloaded and later loaded again.

/Sverker, Erlang/OTP

More information about the erlang-bugs mailing list