r1805 - trunk/glibc

robert at linuxfromscratch.org robert at linuxfromscratch.org
Sat May 5 04:05:13 PDT 2007


Author: robert
Date: 2007-05-05 05:05:13 -0600 (Sat, 05 May 2007)
New Revision: 1805

Added:
   trunk/glibc/glibc-2.5-localedef_trampoline-1.patch
Log:
Added glibc-2.5 localedef_trampoline patch, which is a copy of the glibc-localedef_segfault patch but with updated description and history

Added: trunk/glibc/glibc-2.5-localedef_trampoline-1.patch
===================================================================
--- trunk/glibc/glibc-2.5-localedef_trampoline-1.patch	                        (rev 0)
+++ trunk/glibc/glibc-2.5-localedef_trampoline-1.patch	2007-05-05 11:05:13 UTC (rev 1805)
@@ -0,0 +1,64 @@
+Submitted By: Robert Connolly <robert at linuxfromscratch dot org> (ashes)
+Date: 2007-05-05
+Initial Package Version: 2.5
+Upstream Status: Rejected - http://sources.redhat.com/bugzilla/show_bug.cgi?id=3333
+Origin: Fedora's glibc-fedora.patch (via glibc-2.5.90-21)
+Description: Avoid segmentation faults, or kills, on PaX and Exe-Shield kernels,
+             and some non-x86 architectures.
+
+* Sun Jun 01 2003 Jakub Jelinek <jakub at redhat.com> 2.3.2-46
+  - avoid using trampolines in localedef
+
+This patch is also known as:
+local-localedef-fix-trampoline.diff (Debian)
+1040_all_2.3.3-localedef-fix-trampoline.patch (Gentoo)
+
+Also see:
+http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=231438
+
+diff -Naur glibc-2.5.orig/locale/programs/3level.h glibc-2.5/locale/programs/3level.h
+--- glibc-2.5.orig/locale/programs/3level.h	2005-12-07 05:47:27.000000000 +0000
++++ glibc-2.5/locale/programs/3level.h	2006-10-11 08:05:00.000000000 +0000
+@@ -202,6 +202,42 @@
+ 	}
+     }
+ }
++
++/* GCC ATM seems to do a poor job with pointers to nested functions passed
++   to inlined functions.  Help it a little bit with this hack.  */
++#define wchead_table_iterate(tp, fn) \
++do									      \
++  {									      \
++    struct wchead_table *t = (tp);					      \
++    uint32_t index1;							      \
++    for (index1 = 0; index1 < t->level1_size; index1++)			      \
++      {									      \
++	uint32_t lookup1 = t->level1[index1];				      \
++	if (lookup1 != ((uint32_t) ~0))					      \
++	  {								      \
++	    uint32_t lookup1_shifted = lookup1 << t->q;			      \
++	    uint32_t index2;						      \
++	    for (index2 = 0; index2 < (1 << t->q); index2++)		      \
++	      {								      \
++		uint32_t lookup2 = t->level2[index2 + lookup1_shifted];	      \
++		if (lookup2 != ((uint32_t) ~0))				      \
++		  {							      \
++		    uint32_t lookup2_shifted = lookup2 << t->p;		      \
++		    uint32_t index3;					      \
++		    for (index3 = 0; index3 < (1 << t->p); index3++)	      \
++		      {							      \
++			struct element_t *lookup3			      \
++			  = t->level3[index3 + lookup2_shifted];	      \
++			if (lookup3 != NULL)				      \
++			  fn ((((index1 << t->q) + index2) << t->p) + index3, \
++			      lookup3);					      \
++		      }							      \
++		  }							      \
++	      }								      \
++	  }								      \
++      }									      \
++  } while (0)
++
+ #endif
+ 
+ #ifndef NO_FINALIZE




More information about the patches mailing list