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

clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since c58eb217 was b17b911f, checked in by jim <clfs@…>, 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.