]> git.ipfire.org Git - thirdparty/glibc.git/commit - elf/Makefile
dlopen: Fix issues related to NODELETE handling and relocations
authorFlorian Weimer <fweimer@redhat.com>
Fri, 13 Dec 2019 09:18:24 +0000 (10:18 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Fri, 13 Dec 2019 09:18:24 +0000 (10:18 +0100)
commit365624e2d2a342cdb693b4cc35d2312169959e28
tree4a17435022fd7b0c03690c7ad3444b0d3c030ced
parent186e119bbd4a10895429ffe405ae96dc5c5634b8
dlopen: Fix issues related to NODELETE handling and relocations

The assumption behind the assert in activate_nodelete was wrong:

Inconsistency detected by ld.so: dl-open.c: 459: activate_nodelete:
Assertion `!imap->l_init_called || imap->l_type != lt_loaded' failed! (edit)

It can happen that an already-loaded object that is in the local
scope is promoted to NODELETE status, via binding to a unique
symbol.

Similarly, it is possible that such NODELETE promotion occurs to
an already-loaded object from the global scope.  This is why the
loop in activate_nodelete has to cover all objects in the namespace
of the new object.

In do_lookup_unique, it could happen that the NODELETE status of
an already-loaded object was overwritten with a pending NODELETE
status.  As a result, if dlopen fails, this could cause a loss of
the NODELETE status of the affected object, eventually resulting
in an incorrect unload.

Fixes commit f63b73814f74032c0e5d0a83300e3d864ef905e5 ("Remove all
loaded objects if dlopen fails, ignoring NODELETE [BZ #20839]").
23 files changed:
elf/Makefile
elf/dl-lookup.c
elf/dl-open.c
elf/tst-dlopen-nodelete-reloc-mod1.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod10.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod11.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod12.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod13.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod13.h [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod14.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod15.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod16.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod17.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod2.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod3.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod4.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod5.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod6.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod7.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod8.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc-mod9.cc [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc.c [new file with mode: 0644]
elf/tst-dlopen-nodelete-reloc.h [new file with mode: 0644]