source: scripts/fetch/eglibc/2.10.1/05-localedef_segfault @ cf308924

clfs-1.2clfs-2.1clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since cf308924 was cf308924, checked in by jim <jim@…>, 15 years ago

Updated eglibc fetch script.

  • Property mode set to 100644
File size: 1.9 KB
Line 
1Description: Fixes Segfault when using localdef.
2             This problem is only noticed when using PaX
3             and some architectures besides x86.
4             See debian bug # 231438
5
6             Rediffed for 2.8 by Joe Ciccone
7             Rediffed for 2.9 by Joe Ciccone
8
9diff -Naur glibc-2.8.orig/locale/programs/3level.h glibc-2.8/locale/programs/3level.h
10--- glibc-2.8.orig/locale/programs/3level.h     2007-07-15 20:54:59.000000000 -0400
11+++ glibc-2.8/locale/programs/3level.h  2008-09-20 12:09:34.000000000 -0400
12@@ -203,6 +203,42 @@
13        }
14     }
15 }
16+
17+/* GCC ATM seems to do a poor job with pointers to nested functions passed
18+   to inlined functions.  Help it a little bit with this hack.  */
19+#define wchead_table_iterate(tp, fn) \
20+do                                                                           \
21+  {                                                                          \
22+    struct wchead_table *t = (tp);                                           \
23+    uint32_t index1;                                                         \
24+    for (index1 = 0; index1 < t->level1_size; index1++)                              \
25+      {                                                                              \
26+       uint32_t lookup1 = t->level1[index1];                                 \
27+       if (lookup1 != ((uint32_t) ~0))                                       \
28+         {                                                                   \
29+           uint32_t lookup1_shifted = lookup1 << t->q;                       \
30+           uint32_t index2;                                                  \
31+           for (index2 = 0; index2 < (1 << t->q); index2++)                  \
32+             {                                                               \
33+               uint32_t lookup2 = t->level2[index2 + lookup1_shifted];       \
34+               if (lookup2 != ((uint32_t) ~0))                               \
35+                 {                                                           \
36+                   uint32_t lookup2_shifted = lookup2 << t->p;               \
37+                   uint32_t index3;                                          \
38+                   for (index3 = 0; index3 < (1 << t->p); index3++)          \
39+                     {                                                       \
40+                       struct element_t *lookup3                             \
41+                         = t->level3[index3 + lookup2_shifted];              \
42+                       if (lookup3 != NULL)                                  \
43+                         fn ((((index1 << t->q) + index2) << t->p) + index3, \
44+                             lookup3);                                       \
45+                     }                                                       \
46+                 }                                                           \
47+             }                                                               \
48+         }                                                                   \
49+      }                                                                              \
50+  } while (0)
51+
52 #endif
53 
54 #ifndef NO_FINALIZE
55
Note: See TracBrowser for help on using the repository browser.