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: [email protected]
For additional commands, e-mail: [email protected]