loader: support for permanent dlopen()
authorSebastian Kemper <sebastian_ml@gmx.net>
Tue, 2 Apr 2019 20:49:52 +0000 (22:49 +0200)
committerCorey Farrell <git@cfware.com>
Thu, 4 Apr 2019 19:14:21 +0000 (15:14 -0400)
commitccac55b89443bd9a39f9ec991dc022d300f84b75
tree2e5d0ea63911175977fedbda85f27b7dccadd1fc
parent012706c6c5c81436eb63b42a48d4123aca90ae89
loader: support for permanent dlopen()

Asterisk assumes that dlopen() will always run the constructor of a
shared library and every dlclose() will run its destructor. But dlopen()
may be permanent, meaning the constructor will only be run once, as is
the case with musl libc.

With a permanent dlopen() the Asterisk module loader does not work
correctly, because it's expectations regarding when the constructors and
destructors are run are not met. In fact a segmentation fault will occur
when the first module is "re-opened" that has AST_MODFLAG_GLOBAL_SYMBOLS
set (the dlopen() does not call the constructor, resource_being_loaded
is not set to NULL, then strlen is called with NULL instead of a string,
see issue ASTERISK-28319).

This commit adds code to the loader that will manually run the
constructors/destructors of the (non-builtin) modules where needed. To
achieve this a new ao2 container (linked list) is started and filled
with objects that contain the names of the modules and the pointers to
their respective info structs.

This behavior can be activated when configuring Asterisk
(--enable-permanent-dlopen). By default this is disabled, of course.

ASTERISK-28319 #close

Signed-off-by: Sebastian Kemper <sebastian_ml@gmx.net>
Change-Id: I86693a0ecf25d5ba81c73773a03df4abc3426875
configure
configure.ac
include/asterisk/autoconfig.h.in
main/loader.c