[erlang-bugs] Unloading then reloading crypto.so causes erlang core dump on Solaris 11
XinFeng Liu
xinfeng.liu@REDACTED
Fri Sep 7 11:56:00 CEST 2012
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
>
> Thanks for pointing this. I'm sorry I made a wrong conclusion for the
workaround in modifying reload() function. I wronly modfied reload() in
15B02.
I have some new findings on this issue:
I find the latest 15B02 (without any modification) does not cause core dump
in running couchDB test suite. Digging this issue further, there's a subtle
difference between 15B02 and 15B01 in crypto.so.
In 15B01, crypto.so explicitly link libssl.so, while in 15B02 it does not.
And more importantly, the libssl.so built by Sun/Oracle seems built with
"-z nodelete" meaning RTLD_NODELETE. ("elfdump -d" can show that).
In 15B01, loading crypto.so causes libssl.so to be loaded, since libssl.so
depends on libcrypto.so, libcrypto.so is somehow promoted to RTLD_NODELETE
(using solaris runtime LD debugger can show this). So, libcrypto.so is
unloadable in dlclose().
In 15B02, when running couchDB test suite, unloading crypto.so causes
libcrypto.so unloaded too, then later reloading both crypto.so and
libcrypto.so would not cause previous problem.
A new question, each time loading crypto.so will cause load() to be called,
then it means CRYPTO_set_mem_functions() should be called again, I assume
it should correctly set the callback funcs. But from instruction-level
tracing and the src, it simply returned in line 129 because
"!allow_customize" is true.
(dbx) stepi
t@REDACTED (l@REDACTED) stopped in CRYPTO_set_mem_functions at 0xfd053b0c
0xfd053b0c: CRYPTO_set_mem_functions+0x0034: retl
125 int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *,
size_t),
126 void (*f)(void *))
127 {
128 if (!allow_customize)
129 return 0;
130 if ((m == 0) || (r == 0) || (f == 0))
131 return 0;
132 malloc_func=m; malloc_ex_func=default_malloc_ex;
133 realloc_func=r; realloc_ex_func=default_realloc_ex;
134 free_func=f;
135 malloc_locked_func=m;
malloc_locked_ex_func=default_malloc_locked_ex;
136 free_locked_func=f;
137 return 1;
138 }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20120907/5d41479f/attachment.htm>
More information about the erlang-bugs
mailing list