[COMMITTED] Use PTR_MANGLE on libgcc unwinder function pointers.

Message ID 20141216235908.C2BCC2C2446@topped-with-meat.com
State Committed
Headers

Commit Message

Roland McGrath Dec. 16, 2014, 11:59 p.m. UTC
  This makes the unwinder wrapper in libc consistent with the one in
libpthread with regard to pointer mangling.  Tested x86_64-linux-gnu.


Thanks,
Roland


	* 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.
  

Patch

--- 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>
 
 #pragma GCC optimize ("-fexceptions", "-fasynchronous-unwind-tables")
 
@@ -43,7 +44,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;
 }
 
@@ -52,7 +55,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
@@ -63,6 +69,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);
 }