From 3eb5d2fc71c973b95c9678b0644c26c615668218 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 16 Dec 2014 15:14:03 -0800 Subject: [PATCH] Use PTR_MANGLE on libgcc unwinder function pointers. --- ChangeLog | 7 +++++++ sysdeps/gnu/unwind-resume.c | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 76a9849..4be48d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-12-16 Roland McGrath + + * sysdeps/gnu/unwind-resume.c: #include . + (init): Apply PTR_MANGLE to pointers before storing them. + (_Unwind_Resume, __gcc_personality_v0): Apply PTR_DEMANGLE to pointers + before using them. + 2014-12-16 Joseph Myers [BZ #17719] diff --git a/sysdeps/gnu/unwind-resume.c b/sysdeps/gnu/unwind-resume.c index 5044a71..358b3d5 100644 --- a/sysdeps/gnu/unwind-resume.c +++ b/sysdeps/gnu/unwind-resume.c @@ -20,6 +20,7 @@ #include #include #include +#include static void (*libgcc_s_resume) (struct _Unwind_Exception *exc) __attribute__ ((noreturn)); @@ -41,7 +42,9 @@ init (void) __libc_fatal (LIBGCC_S_SO " must be installed for pthread_cancel to work\n"); + PTR_MANGLE (resume); libgcc_s_resume = resume; + PTR_MANGLE (personality); libgcc_s_personality = personality; } @@ -50,7 +53,10 @@ _Unwind_Resume (struct _Unwind_Exception *exc) { if (__glibc_unlikely (libgcc_s_resume == NULL)) init (); - (*libgcc_s_resume) (exc); + + __typeof (libgcc_s_resume) resume = libgcc_s_resume; + PTR_DEMANGLE (resume); + (*resume) (exc); } _Unwind_Reason_Code @@ -61,6 +67,9 @@ __gcc_personality_v0 (int version, _Unwind_Action actions, { if (__glibc_unlikely (libgcc_s_personality == NULL)) init (); - return (*libgcc_s_personality) (version, actions, exception_class, - ue_header, context); + + __typeof (libgcc_s_personality) personality = libgcc_s_personality; + PTR_DEMANGLE (personality); + + return (*personality) (version, actions, exception_class, ue_header, context); } -- 2.7.4