dlfcn: Failures after dlmopen should not terminate process [BZ #24772]
authorFlorian Weimer <fweimer@redhat.com>
Wed, 21 Apr 2021 17:49:51 +0000 (19:49 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Wed, 21 Apr 2021 17:49:51 +0000 (19:49 +0200)
commitb2964eb1d9a6b8ab1250e8a881cf406182da5875
tree8da8c68905e8f616ed24b0357032409f33231724
parent66d99dc53a9aa2bbc7e8d7dd3ba3507d5ffe8597
dlfcn: Failures after dlmopen should not terminate process [BZ #24772]

Commit 9e78f6f6e7134a5f299cc8de77370218f8019237 ("Implement
_dl_catch_error, _dl_signal_error in libc.so [BZ #16628]") has the
side effect that distinct namespaces, as created by dlmopen, now have
separate implementations of the rtld exception mechanism.  This means
that the call to _dl_catch_error from libdl in a secondary namespace
does not actually install an exception handler because the
thread-local variable catch_hook in the libc.so copy in the secondary
namespace is distinct from that of the base namepace.  As a result, a
dlsym/dlopen/... failure in a secondary namespace terminates the process
with a dynamic linker error because it looks to the exception handler
mechanism as if no handler has been installed.

This commit restores GLRO (dl_catch_error) and uses it to set the
handler in the base namespace.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
dlfcn/dlerror.c
elf/Makefile
elf/dl-error-skeleton.c
elf/rtld.c
elf/tst-dlmopen-dlerror-mod.c [new file with mode: 0644]
elf/tst-dlmopen-dlerror.c [new file with mode: 0644]
sysdeps/generic/ldsodefs.h