diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-12-16 15:14:03 -0800 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2014-12-16 15:47:53 -0800 |
commit | 3eb5d2fc71c973b95c9678b0644c26c615668218 (patch) | |
tree | 3c722912795bd0ca7621cfb5a1e9f6063d477e9f | |
parent | f0481d971e9941004814009c1b0877a43aa10bdb (diff) | |
download | glibc-3eb5d2fc71c973b95c9678b0644c26c615668218.zip glibc-3eb5d2fc71c973b95c9678b0644c26c615668218.tar.gz glibc-3eb5d2fc71c973b95c9678b0644c26c615668218.tar.bz2 |
Use PTR_MANGLE on libgcc unwinder function pointers.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | sysdeps/gnu/unwind-resume.c | 15 |
2 files changed, 19 insertions, 3 deletions
@@ -1,3 +1,10 @@ +2014-12-16 Roland McGrath <roland@hack.frob.com> + + * sysdeps/gnu/unwind-resume.c: #include <sysdep.h>. + (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 <joseph@codesourcery.com> [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 <stdio.h> #include <unwind.h> #include <gnu/lib-names.h> +#include <sysdep.h> 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); } |