]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/glibc/glibc-rh1032628.patch
dhcpcd: fix delay after dhcp down.
[ipfire-2.x.git] / src / patches / glibc / glibc-rh1032628.patch
1 commit 028478fa40d85a73b19638dbe3f83b1acebf370c
2 Author: Ulrich Drepper <drepper@gmail.com>
3 Date: Thu Mar 10 12:51:33 2011 -0500
4
5 Fix copy relocations handling of unique objects.
6
7 2011-03-06 Ulrich Drepper <drepper@gmail.com>
8
9 and a part of:
10
11 commit 33f85a3fb9fe432e0ebf6a3481bc2d5e29cb605f
12 Author: Ulrich Drepper <drepper@gmail.com>
13 Date: Thu Mar 10 03:18:21 2011 -0500
14
15 Don't run tests checking xecutable stack when SELinux is enforcing.
16
17 since the latter incorrectly had a bit of the former changes.
18
19 Additionally, the test case needs -lstdc++ to build.
20
21 diff --git a/elf/Makefile b/elf/Makefile
22 index c427679..56cb1b1 100644
23 --- a/elf/Makefile
24 +++ b/elf/Makefile
25 @@ -201,7 +201,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
26 unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
27 tst-audit1 tst-audit2 tst-audit9 \
28 tst-stackguard1 tst-addr1 tst-thrlock \
29 - tst-unique1 tst-unique2
30 + tst-unique1 tst-unique2 tst-unique3
31 # reldep9
32 test-srcs = tst-pathopt
33 tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
34 @@ -255,6 +255,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
35 order2mod1 order2mod2 order2mod3 order2mod4 \
36 tst-unique1mod1 tst-unique1mod2 \
37 tst-unique2mod1 tst-unique2mod2 \
38 + tst-unique3lib tst-unique3lib2 \
39 tst-auditmod9a tst-auditmod9b
40 ifeq (yes,$(have-initfini-array))
41 modules-names += tst-array2dep tst-array5dep
42 @@ -1178,6 +1179,11 @@ $(objpfx)tst-unique1.out: $(objpfx)tst-unique1mod1.so \
43 $(objpfx)tst-unique2: $(libdl) $(objpfx)tst-unique2mod1.so
44 $(objpfx)tst-unique2.out: $(objpfx)tst-unique2mod2.so
45
46 +LDLIBS-tst-unique3lib.so = -lstdc++
47 +LDLIBS-tst-unique3lib2.so = -lstdc++
48 +$(objpfx)tst-unique3: $(libdl) $(objpfx)tst-unique3lib.so
49 +$(objpfx)tst-unique3.out: $(objpfx)tst-unique3lib2.so
50 +
51 ifeq (yes,$(config-cflags-avx))
52 CFLAGS-tst-audit4.c += -mavx
53 CFLAGS-tst-auditmod4a.c += -mavx
54 diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
55 index 78c8669..874a4bb 100644
56 --- a/elf/dl-lookup.c
57 +++ b/elf/dl-lookup.c
58 @@ -364,8 +363,19 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
59 if (entries[idx].hashval == new_hash
60 && strcmp (entries[idx].name, undef_name) == 0)
61 {
62 - result->s = entries[idx].sym;
63 - result->m = (struct link_map *) entries[idx].map;
64 + if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
65 + {
66 + /* We possibly have to initialize the central
67 + copy from the copy addressed through the
68 + relocation. */
69 + result->s = sym;
70 + result->m = (struct link_map *) map;
71 + }
72 + else
73 + {
74 + result->s = entries[idx].sym;
75 + result->m = (struct link_map *) entries[idx].map;
76 + }
77 __rtld_lock_unlock_recursive (tab->lock);
78 return 1;
79 }
80 diff --git a/elf/tst-unique3.cc b/elf/tst-unique3.cc
81 new file mode 100644
82 index 0000000..b2c9593
83 --- /dev/null
84 +++ b/elf/tst-unique3.cc
85 @@ -0,0 +1,23 @@
86 +#include "tst-unique3.h"
87 +#include <cstdio>
88 +#include "../dlfcn/dlfcn.h"
89 +
90 +int t = S<char>::i;
91 +
92 +int
93 +main (void)
94 +{
95 + std::printf ("%d %d\n", S<char>::i, t);
96 + int result = S<char>::i++ != 1 || t != 1;
97 + result |= in_lib ();
98 + void *d = dlopen ("$ORIGIN/tst-unique3lib2.so", RTLD_LAZY);
99 + int (*fp) ();
100 + if (d == NULL || (fp = (int(*)()) dlsym (d, "in_lib2")) == NULL)
101 + {
102 + std::printf ("failed to get symbol in_lib2\n");
103 + return 1;
104 + }
105 + result |= fp ();
106 + dlclose (d);
107 + return result;
108 +}
109 diff --git a/elf/tst-unique3.h b/elf/tst-unique3.h
110 new file mode 100644
111 index 0000000..716d236
112 --- /dev/null
113 +++ b/elf/tst-unique3.h
114 @@ -0,0 +1,8 @@
115 +// BZ 12510
116 +template<typename T>
117 +struct S
118 +{
119 + static int i;
120 +};
121 +
122 +extern int in_lib (void);
123 diff --git a/elf/tst-unique3lib.cc b/elf/tst-unique3lib.cc
124 new file mode 100644
125 index 0000000..fa8e85a
126 --- /dev/null
127 +++ b/elf/tst-unique3lib.cc
128 @@ -0,0 +1,11 @@
129 +#include <cstdio>
130 +#include "tst-unique3.h"
131 +template<typename T> int S<T>::i = 1;
132 +static int i = S<char>::i;
133 +
134 +int
135 +in_lib (void)
136 +{
137 + std::printf ("in_lib: %d %d\n", S<char>::i, i);
138 + return S<char>::i++ != 2 || i != 1;
139 +}
140 diff --git a/elf/tst-unique3lib2.cc b/elf/tst-unique3lib2.cc
141 new file mode 100644
142 index 0000000..17d817e
143 --- /dev/null
144 +++ b/elf/tst-unique3lib2.cc
145 @@ -0,0 +1,12 @@
146 +#include <cstdio>
147 +#include "tst-unique3.h"
148 +
149 +template<typename T> int S<T>::i;
150 +
151 +extern "C"
152 +int
153 +in_lib2 ()
154 +{
155 + std::printf ("in_lib2: %d\n", S<char>::i);
156 + return S<char>::i != 3;
157 +}
158 diff --git a/include/bits/dlfcn.h b/include/bits/dlfcn.h
159 index cb4a5c2..c31a645 100644
160 --- a/include/bits/dlfcn.h
161 +++ b/include/bits/dlfcn.h
162 @@ -1,4 +1,3 @@
163 #include_next <bits/dlfcn.h>
164
165 -extern void _dl_mcount_wrapper_check (void *__selfpc);
166 libc_hidden_proto (_dl_mcount_wrapper_check)