source: patches/glibc-2.4-localedef_segfault-1.patch@ 6a3dfac

clfs-1.2 clfs-2.1 clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since 6a3dfac was 4af05f3, checked in by Jim Gifford <clfs@…>, 19 years ago

Added: glibc 2.4

  • Property mode set to 100644
File size: 1.9 KB
RevLine 
[69cde8d]1Submitted By: Jim Gifford (patches at jg555 dot com)
2Date: 2005-09-29
3Initial Package Version: 2.3.2
4Origin: Debian
5Upstream Status: Unknown
6Description: Fixes Segfault when using localdef.
7 This problem is only noticed when using PaX
8 and some architectures besides x86.
9 See debian bug # 231438
10
11
12--- glibc-20050926/locale/programs/3level.h.orig 2005-09-30 06:00:37.000000000 +0000
13+++ glibc-20050926/locale/programs/3level.h 2005-09-30 06:01:02.000000000 +0000
14@@ -204,6 +204,42 @@
15 }
16 }
17 }
18+
19+/* GCC ATM seems to do a poor job with pointers to nested functions passed
20+ to inlined functions. Help it a little bit with this hack. */
21+#define wchead_table_iterate(tp, fn) \
22+do \
23+ { \
24+ struct wchead_table *t = (tp); \
25+ uint32_t index1; \
26+ for (index1 = 0; index1 < t->level1_size; index1++) \
27+ { \
28+ uint32_t lookup1 = t->level1[index1]; \
29+ if (lookup1 != ((uint32_t) ~0)) \
30+ { \
31+ uint32_t lookup1_shifted = lookup1 << t->q; \
32+ uint32_t index2; \
33+ for (index2 = 0; index2 < (1 << t->q); index2++) \
34+ { \
35+ uint32_t lookup2 = t->level2[index2 + lookup1_shifted]; \
36+ if (lookup2 != ((uint32_t) ~0)) \
37+ { \
38+ uint32_t lookup2_shifted = lookup2 << t->p; \
39+ uint32_t index3; \
40+ for (index3 = 0; index3 < (1 << t->p); index3++) \
41+ { \
42+ struct element_t *lookup3 \
43+ = t->level3[index3 + lookup2_shifted]; \
44+ if (lookup3 != NULL) \
45+ fn ((((index1 << t->q) + index2) << t->p) + index3, \
46+ lookup3); \
47+ } \
48+ } \
49+ } \
50+ } \
51+ } \
52+ } while (0)
53+
54 #endif
55
56 #ifndef NO_FINALIZE
Note: See TracBrowser for help on using the repository browser.