This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[COMMITTED PATCH] Use PTR_MANGLE on libgcc unwinder function pointers.


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.

--- 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);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]