Author: markt
Date: Wed Aug 22 12:13:07 2018
New Revision: 1838631

URL: http://svn.apache.org/viewvc?rev=1838631&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=59897
Apache: Use poll rather than select to avoid the limitations of select 
triggering an httpd crash.
Patch provided by Koen Wilde.

Modified:
    tomcat/jk/trunk/native/common/jk_connect.c
    tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml

Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=1838631&r1=1838630&r2=1838631&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Wed Aug 22 12:13:07 2018
@@ -231,9 +231,75 @@ static int nb_connect(jk_sock_t sd, jk_s
     JK_TRACE_EXIT(l);
     return 0;
 }
+#elif defined(HAVE_POLL_H)
+/* POSIX implementation using poll(2) */
+/** Non-blocking socket connect
+ * @param sd       socket to connect
+ * @param addr     address to connect to
+ * @param source   optional source address
+ * @param timeout  connect timeout in seconds
+ *                 (<=0: no timeout=blocking)
+ * @param l        logger
+ * @return         -1: some kind of error occured
+ *                 0: success
+ */
+static int nb_connect(jk_sock_t sd, jk_sockaddr_t *addr, jk_sockaddr_t *source,
+                      int timeout, jk_logger_t *l) {
+    int rc = 0;
+    char buf[64];
+
+    JK_TRACE_ENTER(l);
+
+    if (source != NULL) {
+        if (bind(sd, (const struct sockaddr *)&source->sa.sin, source->salen)) 
{
+            JK_GET_SOCKET_ERRNO();
+            jk_log(l, JK_LOG_ERROR,
+                   "error during source bind on socket %d [%s] (errno=%d)", sd,
+                   jk_dump_hinfo(source, buf, sizeof(buf)), errno);
+        }
+    }
+    if (timeout > 0) {
+        if (sononblock(sd)) {
+            JK_TRACE_EXIT(l);
+            return -1;
+        }
+    }
+    do {
+        rc = connect(sd, (const struct sockaddr *)&addr->sa.sin, addr->salen);
+    } while (rc == -1 && errno == EINTR);
+
+    if ((rc == -1) && (errno == EINPROGRESS || errno == EALREADY)
+                   && (timeout > 0)) {
+        struct pollfd pfd;
+        socklen_t rclen = (socklen_t)sizeof(rc);
+        pfd.fd = sd;
+        pfd.events = POLLOUT;
+        rc = poll(&pfd, 1, timeout * 1000);
+        if (rc <= 0) {
+            /* Save errno */
+            int err = errno;
+            soblock(sd);
+            errno = err;
+            JK_TRACE_EXIT(l);
+            return -1;
+        }
+        rc = 0;
+#ifdef SO_ERROR
+       if (getsockopt(sd, SOL_SOCKET, SO_ERROR,
+                        (char *)&rc, &rclen) < 0 || rc) {
+            if (rc)
+                errno = rc;
+            rc = -1;
+        }
+#endif
+    }
+    soblock(sd);
+    JK_TRACE_EXIT(l);
+    return rc;
+}
 
 #else
-/* POSIX implementation */
+/* POSIX implementation using select(2) */
 /** Non-blocking socket connect
  * @param sd       socket to connect
  * @param addr     address to connect to

Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1838631&r1=1838630&r2=1838631&view=diff
==============================================================================
--- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Wed Aug 22 12:13:07 2018
@@ -54,6 +54,11 @@
         Windows to better support multi-user environments. (markt)
       </fix>
       <fix>
+        <bug>59897</bug>: Apache: Use poll rather than select to avoid the
+        limitations of select triggering an httpd crash. Patch provided by Koen
+        Wilde. (markt)
+      </fix>
+      <fix>
         <bug>60745</bug>: ISAPI: Remove the check that rejects requests that
         contain path segments that match WEB-INF or META-INF as it duplicates
         a check that Tomcat performs and, because ISAPI does not have 
visibility



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

Reply via email to