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