From: Jim Jagielski Date: Wed, 20 Dec 2006 02:04:39 +0000 (+0000) Subject: Merge r487901 from trunk: X-Git-Tag: 2.2.4~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=378747067e0d86753e11c56d27d0686601ab43c9;p=thirdparty%2Fapache%2Fhttpd.git Merge r487901 from trunk: PR#37680: fix socket block/nonblock on restart/graceful Patch submitted by Darius Davis (darius-abz free-range.com.au) Submitted by: niq Reviewed by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@488883 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 40ec0c4c14a..e6671a16757 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.4 + *) core: Fix NONBLOCK status of listening sockets on restart/graceful + PR 37680. [Darius Davis ] + *) mod_deflate: Rework inflate output and deflate output filter to fix several issues: Incorrect handling of flush buckets, potential memory leaks, excessive memory usage in inflate output filter for large compressed diff --git a/STATUS b/STATUS index dc44bfcb540..36134e2fff8 100644 --- a/STATUS +++ b/STATUS @@ -86,13 +86,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: http://mail-archives.apache.org/mod_mbox//httpd-dev/200609.mbox/%3c1404e5910609091218p84f4d2flc1000764b4966727@mail.gmail.com%3e +1: trawick, wrowe, jerenkrantz - * core: PR#37680 - Fix NONBLOCK status of listening sockets on restart/graceful - http://svn.apache.org/viewvc?view=rev&revision=487901 - +1: niq, wrowe, rpluem - wrowe adds; if use_nonblock was called multi_listeners - I woulda +1'ed this on my first readthrough. - PATCHES PROPOSED TO BACKPORT FROM TRUNK: * mpm_winnt: Fix return values from wait_for_many_objects. diff --git a/server/listen.c b/server/listen.c index ddf87403987..f679f058200 100644 --- a/server/listen.c +++ b/server/listen.c @@ -361,6 +361,9 @@ static int open_listeners(apr_pool_t *pool) int num_open; const char *userdata_key = "ap_open_listeners"; void *data; +#if AP_NONBLOCK_WHEN_MULTI_LISTEN + int use_nonblock; +#endif /* Don't allocate a default listener. If we need to listen to a * port, then the user needs to have a Listen directive in their @@ -476,16 +479,15 @@ static int open_listeners(apr_pool_t *pool) * is already forgotten about by the time we call accept, we won't * be hung until another connection arrives on that port */ - if (ap_listeners && ap_listeners->next) { - for (lr = ap_listeners; lr; lr = lr->next) { - apr_status_t status; - - status = apr_socket_opt_set(lr->sd, APR_SO_NONBLOCK, 1); - if (status != APR_SUCCESS) { - ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, status, pool, - "unable to make listening socket non-blocking"); - return -1; - } + use_nonblock = (ap_listeners && ap_listeners->next); + for (lr = ap_listeners; lr; lr = lr->next) { + apr_status_t status; + + status = apr_socket_opt_set(lr->sd, APR_SO_NONBLOCK, use_nonblock); + if (status != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, status, pool, + "unable to control socket non-blocking status"); + return -1; } } #endif /* AP_NONBLOCK_WHEN_MULTI_LISTEN */