File libcurl-ocloexec.patch of Package curl
Open library file descriptors with O_CLOEXEC
This patch is non-portable, it needs linux 2.6.23 and glibc 2.7
or later, different combinations (old linux, new glibc and vice-versa)
will result in a crash.
To make it portable you have to test O_CLOEXEC support at *runtime*
compile time is not enough.
Index: curl-8.19.0-rc2/lib/file.c
===================================================================
--- curl-8.19.0-rc2.orig/lib/file.c
+++ curl-8.19.0-rc2/lib/file.c
@@ -228,7 +228,7 @@ static CURLcode file_connect(struct Curl
}
}
#else
- fd = curlx_open(real_path, O_RDONLY);
+ fd = curlx_open(real_path, O_RDONLY|O_CLOEXEC);
file->path = real_path;
#endif
#endif
@@ -296,9 +296,9 @@ static CURLcode file_upload(struct Curl_
data->set.new_file_perms & (_S_IREAD | _S_IWRITE));
#elif (defined(ANDROID) || defined(__ANDROID__)) && \
(defined(__i386__) || defined(__arm__))
- fd = curlx_open(file->path, mode, (mode_t)data->set.new_file_perms);
+ fd = curlx_open(file->path, mode|O_CLOEXEC, (mode_t)data->set.new_file_perms);
#else
- fd = curlx_open(file->path, mode, data->set.new_file_perms);
+ fd = curlx_open(file->path, mode|O_CLOEXEC, data->set.new_file_perms);
#endif
if(fd < 0) {
failf(data, "cannot open %s for writing", file->path);
Index: curl-8.19.0-rc2/lib/if2ip.c
===================================================================
--- curl-8.19.0-rc2.orig/lib/if2ip.c
+++ curl-8.19.0-rc2/lib/if2ip.c
@@ -202,7 +202,7 @@ if2ip_result_t Curl_if2ip(int af,
if(len >= sizeof(req.ifr_name))
return IF2IP_NOT_FOUND;
- dummy = CURL_SOCKET(AF_INET, SOCK_STREAM, 0);
+ dummy = CURL_SOCKET(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0);
if(dummy == CURL_SOCKET_BAD)
return IF2IP_NOT_FOUND;
Index: curl-8.19.0-rc2/configure.ac
===================================================================
--- curl-8.19.0-rc2.orig/configure.ac
+++ curl-8.19.0-rc2/configure.ac
@@ -507,6 +507,8 @@ AC_DEFINE_UNQUOTED(CURL_OS, "${host}", [
# Silence warning: ar: 'u' modifier ignored since 'D' is the default
AC_SUBST(AR_FLAGS, [cr])
+AC_USE_SYSTEM_EXTENSIONS
+
dnl This defines _ALL_SOURCE for AIX
CURL_CHECK_AIX_ALL_SOURCE
Index: curl-8.19.0-rc2/lib/hostip.c
===================================================================
--- curl-8.19.0-rc2.orig/lib/hostip.c
+++ curl-8.19.0-rc2/lib/hostip.c
@@ -43,6 +43,7 @@
#include <setjmp.h> /* for sigjmp_buf, sigsetjmp() */
#include <signal.h>
+#include <fcntl.h>
#include "urldata.h"
#include "curl_addrinfo.h"
#include "curl_trc.h"
@@ -752,7 +753,7 @@ static struct Curl_addrinfo *get_localho
CURLcode Curl_probeipv6(struct Curl_multi *multi)
{
/* probe to see if we have a working IPv6 stack */
- curl_socket_t s = CURL_SOCKET(PF_INET6, SOCK_DGRAM, 0);
+ curl_socket_t s = CURL_SOCKET(PF_INET6, SOCK_DGRAM|SOCK_CLOEXEC, 0);
multi->ipv6_works = FALSE;
if(s == CURL_SOCKET_BAD) {
if(SOCKERRNO == SOCKENOMEM)
Index: curl-8.19.0-rc2/lib/cf-socket.c
===================================================================
--- curl-8.19.0-rc2.orig/lib/cf-socket.c
+++ curl-8.19.0-rc2/lib/cf-socket.c
@@ -342,7 +342,8 @@ static CURLcode socket_open(struct Curl_
return CURLE_COULDNT_CONNECT;
}
#endif
- *sockfd = CURL_SOCKET(addr->family, addr->socktype, addr->protocol);
+ *sockfd = CURL_SOCKET(addr->family, addr->socktype|SOCK_CLOEXEC,
+ addr->protocol);
if((*sockfd == CURL_SOCKET_BAD) && (SOCKERRNO == SOCKENOMEM))
return CURLE_OUT_OF_MEMORY;
}