mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Harden tls_dtor_list with pointer mangling [BZ #19018]
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
2015-10-06 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
[BZ #19018]
|
||||||
|
* stdlib/cxa_thread_atexit_impl.c (__cxa_thread_atexit_impl):
|
||||||
|
Mangle function pointer before storing it.
|
||||||
|
(__call_tls_dtors): Demangle function pointer before calling it.
|
||||||
|
|
||||||
2015-10-05 Paul Pluzhnikov <ppluzhnikov@google.com>
|
2015-10-05 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||||
|
|
||||||
[BZ #19012]
|
[BZ #19012]
|
||||||
|
4
NEWS
4
NEWS
@ -17,8 +17,8 @@ Version 2.23
|
|||||||
18757, 18778, 18781, 18787, 18789, 18790, 18795, 18796, 18803, 18820,
|
18757, 18778, 18781, 18787, 18789, 18790, 18795, 18796, 18803, 18820,
|
||||||
18823, 18824, 18825, 18857, 18863, 18870, 18872, 18873, 18875, 18887,
|
18823, 18824, 18825, 18857, 18863, 18870, 18872, 18873, 18875, 18887,
|
||||||
18921, 18951, 18952, 18956, 18961, 18966, 18967, 18969, 18970, 18977,
|
18921, 18951, 18952, 18956, 18961, 18966, 18967, 18969, 18970, 18977,
|
||||||
18980, 18981, 18985, 19003, 19012, 19016, 19032, 19046, 19049, 19050,
|
18980, 18981, 18985, 19003, 19012, 19016, 19018, 19032, 19046, 19049,
|
||||||
19059, 19071.
|
19050, 19059, 19071.
|
||||||
|
|
||||||
* The obsolete header <regexp.h> has been removed. Programs that require
|
* The obsolete header <regexp.h> has been removed. Programs that require
|
||||||
this header must be updated to use <regex.h> instead.
|
this header must be updated to use <regex.h> instead.
|
||||||
|
@ -98,6 +98,10 @@ static __thread struct link_map *lm_cache;
|
|||||||
int
|
int
|
||||||
__cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol)
|
__cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol)
|
||||||
{
|
{
|
||||||
|
#ifdef PTR_MANGLE
|
||||||
|
PTR_MANGLE (func);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Prepend. */
|
/* Prepend. */
|
||||||
struct dtor_list *new = calloc (1, sizeof (struct dtor_list));
|
struct dtor_list *new = calloc (1, sizeof (struct dtor_list));
|
||||||
new->func = func;
|
new->func = func;
|
||||||
@ -142,9 +146,13 @@ __call_tls_dtors (void)
|
|||||||
while (tls_dtor_list)
|
while (tls_dtor_list)
|
||||||
{
|
{
|
||||||
struct dtor_list *cur = tls_dtor_list;
|
struct dtor_list *cur = tls_dtor_list;
|
||||||
|
dtor_func func = cur->func;
|
||||||
|
#ifdef PTR_DEMANGLE
|
||||||
|
PTR_DEMANGLE (func);
|
||||||
|
#endif
|
||||||
|
|
||||||
tls_dtor_list = tls_dtor_list->next;
|
tls_dtor_list = tls_dtor_list->next;
|
||||||
cur->func (cur->obj);
|
func (cur->obj);
|
||||||
|
|
||||||
/* Ensure that the MAP dereference happens before
|
/* Ensure that the MAP dereference happens before
|
||||||
l_tls_dtor_count decrement. That way, we protect this access from a
|
l_tls_dtor_count decrement. That way, we protect this access from a
|
||||||
|
Reference in New Issue
Block a user