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 <[EMAIL PROTECTED]> 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

-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to