yann@2437
|
1 |
http://bugs.gentoo.org/250342
|
yann@2437
|
2 |
http://sources.redhat.com/bugzilla/show_bug.cgi?id=9685
|
yann@2437
|
3 |
|
yann@2437
|
4 |
we cant assume sock_cloexec and pipe2 are bound together as the former defines
|
yann@2437
|
5 |
are found in glibc only while the latter are a combo of kernel headers and
|
yann@2437
|
6 |
glibc. so if we do a runtime detection of SOCK_CLOEXEC, but pipe2() is a stub
|
yann@2437
|
7 |
inside of glibc, we hit a problem. for example:
|
yann@2437
|
8 |
|
yann@2437
|
9 |
#include <grp.h>
|
yann@2437
|
10 |
#include <stdio.h>
|
yann@2437
|
11 |
main()
|
yann@2437
|
12 |
{
|
yann@2437
|
13 |
getgrnam("portage");
|
yann@2437
|
14 |
if (!popen("ls", "r"))
|
yann@2437
|
15 |
perror("popen()");
|
yann@2437
|
16 |
}
|
yann@2437
|
17 |
|
yann@2437
|
18 |
getgrnam() will detect that the kernel supports SOCK_CLOEXEC and then set both
|
yann@2437
|
19 |
__have_sock_cloexec and __have_pipe2 to true. but if glibc was built against
|
yann@2437
|
20 |
older kernel headers where __NR_pipe2 does not exist, glibc will have a ENOSYS
|
yann@2437
|
21 |
stub for it. so popen() will always fail as glibc assumes pipe2() works.
|
yann@2437
|
22 |
|
yann@2437
|
23 |
diff -durN glibc-2.12.1.orig/socket/have_sock_cloexec.c glibc-2.12.1/socket/have_sock_cloexec.c
|
yann@2437
|
24 |
--- glibc-2.12.1.orig/socket/have_sock_cloexec.c 2008-07-25 18:46:23.000000000 +0200
|
yann@2437
|
25 |
+++ glibc-2.12.1/socket/have_sock_cloexec.c 2009-11-13 00:50:15.000000000 +0100
|
yann@2437
|
26 |
@@ -16,9 +16,14 @@
|
yann@2437
|
27 |
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
yann@2437
|
28 |
02111-1307 USA. */
|
yann@2437
|
29 |
|
yann@2437
|
30 |
+#include <fcntl.h>
|
yann@2437
|
31 |
#include <sys/socket.h>
|
yann@2437
|
32 |
#include <kernel-features.h>
|
yann@2437
|
33 |
|
yann@2437
|
34 |
#if defined SOCK_CLOEXEC && !defined __ASSUME_SOCK_CLOEXEC
|
yann@2437
|
35 |
int __have_sock_cloexec;
|
yann@2437
|
36 |
#endif
|
yann@2437
|
37 |
+
|
yann@2437
|
38 |
+#if defined O_CLOEXEC && !defined __ASSUME_PIPE2
|
yann@2437
|
39 |
+int __have_pipe2;
|
yann@2437
|
40 |
+#endif
|