Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Clear DF_1_NODELETE flag only for failed to load library.
https://sourceware.org/bugzilla/show_bug.cgi?id=18778 If dlopen fails to load an object that has triggered loading libpthread it causes ld.so to unload libpthread because its DF_1_NODELETE flags has been forcefully cleared. The next call to __rtdl_unlock_lock_recursive will crash since pthread_mutex_unlock no longer exists. This patch moves l->l_flags_1 &= ~DF_1_NODELETE out of loop through all loaded libraries and performs the action only on inconsistent one. [BZ #18778] * elf/Makefile (tests): Add Add tst-nodelete2. (modules-names): Add tst-nodelete2mod. (tst-nodelete2mod.so-no-z-defs): New. ($(objpfx)tst-nodelete2): Likewise. ($(objpfx)tst-nodelete2.out): Likewise. (LDFLAGS-tst-nodelete2): Likewise. * elf/dl-close.c (_dl_close_worker): Move DF_1_NODELETE clearing out of loop through all loaded libraries. * elf/tst-nodelete2.c: New file. * elf/tst-nodelete2mod.c: Likewise.
- Loading branch information
Maxim Ostapenko
authored and
Andreas Schwab
committed
Aug 11, 2015
1 parent
dc8a7ff
commit f25238f
Showing
6 changed files
with
71 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
#include "../dlfcn/dlfcn.h" | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <gnu/lib-names.h> | ||
|
||
static int | ||
do_test (void) | ||
{ | ||
int result = 0; | ||
|
||
printf ("\nOpening pthread library.\n"); | ||
void *pthread = dlopen (LIBPTHREAD_SO, RTLD_LAZY); | ||
|
||
/* This is a test for correct DF_1_NODELETE clearing when dlopen failure | ||
happens. We should clear DF_1_NODELETE for failed library only, because | ||
doing this for others (e.g. libpthread) might cause them to be unloaded, | ||
that may lead to some global references (e.g. __rtld_lock_unlock) to be | ||
broken. The dlopen should fail because of undefined symbols in shared | ||
library, that cause DF_1_NODELETE to be cleared. For libpthread, this | ||
flag should be set, because if not, SIGSEGV will happen in dlclose. */ | ||
if (dlopen ("tst-nodelete2mod.so", RTLD_NOW) != NULL) | ||
{ | ||
printf ("Unique symbols test failed\n"); | ||
result = 1; | ||
} | ||
|
||
if (pthread) | ||
dlclose (pthread); | ||
|
||
if (result == 0) | ||
printf ("SUCCESS\n"); | ||
|
||
return result; | ||
} | ||
|
||
#define TEST_FUNCTION do_test () | ||
#include "../test-skeleton.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
/* Undefined symbol. */ | ||
extern int not_exist (void); | ||
|
||
int foo (void) | ||
{ | ||
return not_exist (); | ||
return not_exist (); | ||
} |