r1146 - in trunk: . glibc

jim at linuxfromscratch.org jim at linuxfromscratch.org
Thu Sep 29 23:03:41 PDT 2005


Author: jim
Date: 2005-09-30 00:03:39 -0600 (Fri, 30 Sep 2005)
New Revision: 1146

Added:
   trunk/glibc/glibc-20050926-localedef_segfault-1.patch
Modified:
   trunk/
Log:
 r1302 at server:  jim | 2005-09-29 23:03:23 -0700
 Added: glibc-20050926-localedef_segfault-1.patch



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - cc2644d5-6cf8-0310-b111-c40428001e49:/patches:1300
   + cc2644d5-6cf8-0310-b111-c40428001e49:/patches:1302

Added: trunk/glibc/glibc-20050926-localedef_segfault-1.patch
===================================================================
--- trunk/glibc/glibc-20050926-localedef_segfault-1.patch	2005-09-28 18:57:59 UTC (rev 1145)
+++ trunk/glibc/glibc-20050926-localedef_segfault-1.patch	2005-09-30 06:03:39 UTC (rev 1146)
@@ -0,0 +1,56 @@
+Submitted By: Jim Gifford (patches at jg555 dot com)
+Date: 2005-09-29
+Initial Package Version: 2.3.2
+Origin: Debian
+Upstream Status: Unknown
+Description: Fixes Segfault when using localdef.
+             This problem is only noticed when using PaX
+             and some architectures besides x86.
+	     See debian bug # 231438
+
+ 
+--- glibc-20050926/locale/programs/3level.h.orig	2005-09-30 06:00:37.000000000 +0000
++++ glibc-20050926/locale/programs/3level.h	2005-09-30 06:01:02.000000000 +0000
+@@ -204,6 +204,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