Use PTR_MANGLE on libgcc unwinder function pointers.
authorRoland McGrath <roland@hack.frob.com>
Tue, 16 Dec 2014 23:14:03 +0000 (15:14 -0800)
committerRoland McGrath <roland@hack.frob.com>
Tue, 16 Dec 2014 23:47:53 +0000 (15:47 -0800)
ChangeLog
sysdeps/gnu/unwind-resume.c

index 76a9849..4be48d0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]
index 5044a71..358b3d5 100644 (file)
@@ -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);
 }