yann@1201
|
1 |
Original patch from: gentoo/src/patchsets/glibc/2.9/1095_all_glibc-2.9-assume-pipe2.patch
|
yann@1201
|
2 |
|
yann@1201
|
3 |
-= BEGIN original header =-
|
yann@1201
|
4 |
http://bugs.gentoo.org/250342
|
yann@1201
|
5 |
http://sources.redhat.com/bugzilla/show_bug.cgi?id=9685
|
yann@1201
|
6 |
|
yann@1201
|
7 |
we cant assume sock_cloexec and pipe2 are bound together as the former defines
|
yann@1201
|
8 |
are found in glibc only while the latter are a combo of kernel headers and
|
yann@1201
|
9 |
glibc. so if we do a runtime detection of SOCK_CLOEXEC, but pipe2() is a stub
|
yann@1201
|
10 |
inside of glibc, we hit a problem. for example:
|
yann@1201
|
11 |
|
yann@1201
|
12 |
#include <grp.h>
|
yann@1201
|
13 |
#include <stdio.h>
|
yann@1201
|
14 |
main()
|
yann@1201
|
15 |
{
|
yann@1201
|
16 |
getgrnam("portage");
|
yann@1201
|
17 |
if (!popen("ls", "r"))
|
yann@1201
|
18 |
perror("popen()");
|
yann@1201
|
19 |
}
|
yann@1201
|
20 |
|
yann@1201
|
21 |
getgrnam() will detect that the kernel supports SOCK_CLOEXEC and then set both
|
yann@1201
|
22 |
__have_sock_cloexec and __have_pipe2 to true. but if glibc was built against
|
yann@1201
|
23 |
older kernel headers where __NR_pipe2 does not exist, glibc will have a ENOSYS
|
yann@1201
|
24 |
stub for it. so popen() will always fail as glibc assumes pipe2() works.
|
yann@1201
|
25 |
|
yann@1201
|
26 |
-= END original header =-
|
yann@1201
|
27 |
|
yann@1201
|
28 |
diff -durN glibc-2_9.orig/include/unistd.h glibc-2_9/include/unistd.h
|
yann@1201
|
29 |
--- glibc-2_9.orig/include/unistd.h 2008-07-27 20:23:17.000000000 +0200
|
yann@1201
|
30 |
+++ glibc-2_9/include/unistd.h 2009-02-02 22:01:05.000000000 +0100
|
yann@1201
|
31 |
@@ -167,9 +167,6 @@
|
yann@1201
|
32 |
extern int __pause_nocancel (void) attribute_hidden;
|
yann@1201
|
33 |
|
yann@1201
|
34 |
extern int __have_sock_cloexec;
|
yann@1201
|
35 |
-/* At lot of other functionality became available at the same time as
|
yann@1201
|
36 |
- SOCK_CLOEXEC. Avoid defining separate variables for all of them
|
yann@1201
|
37 |
- unless it is really necessary. */
|
yann@1201
|
38 |
-#define __have_pipe2 __have_sock_cloexec
|
yann@1201
|
39 |
+extern int __have_pipe2;
|
yann@1201
|
40 |
|
yann@1201
|
41 |
#endif
|
yann@1201
|
42 |
diff -durN glibc-2_9.orig/socket/have_sock_cloexec.c glibc-2_9/socket/have_sock_cloexec.c
|
yann@1201
|
43 |
--- glibc-2_9.orig/socket/have_sock_cloexec.c 2008-07-25 18:46:23.000000000 +0200
|
yann@1201
|
44 |
+++ glibc-2_9/socket/have_sock_cloexec.c 2009-02-02 22:01:05.000000000 +0100
|
yann@1201
|
45 |
@@ -16,9 +16,14 @@
|
yann@1201
|
46 |
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
yann@1201
|
47 |
02111-1307 USA. */
|
yann@1201
|
48 |
|
yann@1201
|
49 |
+#include <fcntl.h>
|
yann@1201
|
50 |
#include <sys/socket.h>
|
yann@1201
|
51 |
#include <kernel-features.h>
|
yann@1201
|
52 |
|
yann@1201
|
53 |
#if defined SOCK_CLOEXEC && !defined __ASSUME_SOCK_CLOEXEC
|
yann@1201
|
54 |
int __have_sock_cloexec;
|
yann@1201
|
55 |
#endif
|
yann@1201
|
56 |
+
|
yann@1201
|
57 |
+#if defined O_CLOEXEC && !defined __ASSUME_PIPE2
|
yann@1201
|
58 |
+int __have_pipe2;
|
yann@1201
|
59 |
+#endif
|