You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2009/12/21 09:31:40 UTC

svn commit: r892725 - in /tomcat/jk/trunk/native: common/jk_connect.c configure.in

Author: mturk
Date: Mon Dec 21 08:31:40 2009
New Revision: 892725

URL: http://svn.apache.org/viewvc?rev=892725&view=rev
Log:
Add SOCK_CLOEXEC|FD_CLOEXEC when creting sockets. This should fix the #48169

Modified:
    tomcat/jk/trunk/native/common/jk_connect.c
    tomcat/jk/trunk/native/configure.in

Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=892725&r1=892724&r2=892725&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Mon Dec 21 08:31:40 2009
@@ -427,6 +427,7 @@
     jk_sock_t sd;
     int set = 1;
     int ret = 0;
+    int flags = 0;
 #ifdef SO_LINGER
     struct linger li;
 #endif
@@ -434,7 +435,10 @@
     JK_TRACE_ENTER(l);
 
     errno = 0;
-    sd = socket(AF_INET, SOCK_STREAM, 0);
+#if defined(SOCK_CLOEXEC) && defined(USE_SOCK_CLOEXEC)
+    flags |= SOCK_CLOEXEC;
+#endif
+    sd = socket(AF_INET, SOCK_STREAM | flags, 0);
     if (!IS_VALID_SOCKET(sd)) {
         JK_GET_SOCKET_ERRNO();
         jk_log(l, JK_LOG_ERROR,
@@ -442,6 +446,26 @@
         JK_TRACE_EXIT(l);
         return JK_INVALID_SOCKET;
     }
+#if defined(FD_CLOEXEC) && !defined(USE_SOCK_CLOEXEC)
+    if ((flags = fcntl(sd, F_GETFD)) == -1) {
+        JK_GET_SOCKET_ERRNO();
+        jk_log(l, JK_LOG_ERROR,
+               "fcntl() failed (errno=%d)", errno);
+        jk_close_socket(sd, l);
+        JK_TRACE_EXIT(l);
+        return JK_INVALID_SOCKET;
+    }
+    flags |= FD_CLOEXEC;
+    if (fcntl(sd, F_SETFD, flags) == -1) {
+        JK_GET_SOCKET_ERRNO();
+        jk_log(l, JK_LOG_ERROR,
+               "fcntl() failed (errno=%d)", errno);
+        jk_close_socket(sd, l);
+        JK_TRACE_EXIT(l);
+        return JK_INVALID_SOCKET;
+    }
+#endif
+
     /* Disable Nagle algorithm */
     if (setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (SET_TYPE)&set,
                    sizeof(set))) {

Modified: tomcat/jk/trunk/native/configure.in
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/configure.in?rev=892725&r1=892724&r2=892725&view=diff
==============================================================================
--- tomcat/jk/trunk/native/configure.in (original)
+++ tomcat/jk/trunk/native/configure.in Mon Dec 21 08:31:40 2009
@@ -319,6 +319,35 @@
 JK_CHECK_SETSOCKOPT(SO_RCVTIMEO)
 JK_CHECK_SETSOCKOPT(SO_SNDTIMEO)
 
+AC_DEFUN([JK_CHECK_SOCKOPT], [
+AC_MSG_CHECKING(whether to use $1 with socket())
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+int main(void)
+{
+    int s;
+
+#ifndef $1
+    exit(3);
+#else
+    if ((s = socket(AF_INET, SOCK_STREAM | $1, 0)) == -1)
+        exit(2);
+
+    exit(0);
+#endif
+}
+]
+, [ AC_MSG_RESULT([yes]) AC_DEFINE(USE_$1, 1, [Define to use $1 with socket()]) ]
+, [ AC_MSG_RESULT([no]) ]
+)
+])dnl
+
+dnl check for SOCK_CLOEXEC
+JK_CHECK_SOCKOPT(SOCK_CLOEXEC)
+
 dnl check for poll.h header
 AC_CHECK_HEADERS(poll.h)
 dnl check for poll function



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org