Check mismatched TLS/non-TLS symbols

This commit is contained in:
H.J. Lu 2012-09-04 13:18:28 -07:00
parent edb3cb8831
commit dae6f911e3
2 changed files with 31 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2012-09-04 H.J. Lu <hongjiu.lu@intel.com>
[BZ #14370]
* elf/dl-lookup.c (_dl_lookup_symbol_x): Check mismatched
TLS/non-TLS symbols.
2012-09-04 Florian Weimer <fweimer@redhat.com>
* stdlib/tst-secure-getenv.c (alternative_main): Only warn on SGID

View File

@ -840,6 +840,31 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
? undef_map->l_scope : symbol_scope,
version, type_class, flags, skip_map);
if (__builtin_expect (*ref != NULL, 1)
&& (__builtin_expect (ELFW(ST_TYPE) (current_value.s->st_info) == STT_TLS, 0)
|| __builtin_expect (ELFW(ST_TYPE) ((*ref)->st_info) == STT_TLS, 0))
&& __builtin_expect (ELFW(ST_TYPE) (current_value.s->st_info) !=
ELFW(ST_TYPE) ((*ref)->st_info), 1))
{
const char *reference_name = undef_map ? undef_map->l_name : "";
const char *definition_name = (current_value.m->l_name[0]
? current_value.m->l_name
: rtld_progname);
_dl_signal_cerror (0, (reference_name[0]
? reference_name
: (rtld_progname ?: "<main program>")),
N_("symbol lookup error"),
make_string ((ELFW(ST_TYPE) ((*ref)->st_info) == STT_TLS
? "TLS" : "non-TLS"),
" definition `", undef_name,
"' mismatches ",
(ELFW(ST_TYPE) (current_value.s->st_info) == STT_TLS
? "TLS" : "non-TLS"),
" reference in ", definition_name));
*ref = NULL;
return 0;
}
/* The object is used. */
if (__builtin_expect (current_value.m->l_used == 0, 0))
current_value.m->l_used = 1;