From: Jim Jagielski Date: Tue, 4 Feb 2014 14:22:18 +0000 (+0000) Subject: Merge r1523387 from trunk: X-Git-Tag: 2.4.8~149 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=1f54be95da2e324f40766bbb4d6f4bf62e79cd2b;p=thirdparty%2Fapache%2Fhttpd.git Merge r1523387 from trunk: In 2.4, the MPM leaves a copy of the non-disconnected FD sitting in context->accept_socket. This FD will be closed a second time, often shortly after a worker picks it up in this same FD being reused. The first recv fails with WSAENOTSOCK since the same FD was closed in the listener thread while the worker was pulling it off the queue (The second close is of the underlying FD/socket, not a shared apr_socket_t, so it's not short-circuited) This patch makes it a bit more 2.2.x-ish and solves my problem -- the context->accept_socket gets zapped at the bottom of the loop if !disconnected. Submitted by: covener Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1564313 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e17569d025e..2389435524a 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.4.8 + *) WinNT MPM: If ap_run_pre_connection() fails or sets c->aborted, don't + save the socket for reuse by the next worker as if it were an + APR_SO_DISCONNECTED socket. Restores 2.2 behavior. [Eric Covener] + *) mod_dir: Don't search for a DirectoryIndex or DirectorySlash on a URL that was just rewritten by mod_rewrite. PR53929. [Eric Covener] diff --git a/STATUS b/STATUS index 7b11b384c78..3cfe6d98f20 100644 --- a/STATUS +++ b/STATUS @@ -98,12 +98,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * WinNT MPM: If ap_run_pre_connection() fails or sets c->aborted, don't - save the socket for reuse by the next worker as if it were an - APR_SO_DISCONNECTED socket. Restores 2.2 behavior. - trunk patch: http://svn.apache.org/r1523387 - 2.4.x patch: trunk works - +1: trawick, covener, jim PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/server/mpm/winnt/child.c b/server/mpm/winnt/child.c index c9168b08efa..6879179fa1e 100644 --- a/server/mpm/winnt/child.c +++ b/server/mpm/winnt/child.c @@ -878,12 +878,13 @@ static DWORD __stdcall worker_main(void *thread_num_val) if (!c->aborted) { ap_run_process_connection(c); + } - apr_socket_opt_get(context->sock, APR_SO_DISCONNECTED, - &disconnected); + apr_socket_opt_get(context->sock, APR_SO_DISCONNECTED, &disconnected); - if (!disconnected) { - context->accept_socket = INVALID_SOCKET; + if (!disconnected) { + context->accept_socket = INVALID_SOCKET; + if (!c->aborted) { ap_lingering_close(c); } }