diff options
author | Greg Ames <gregames@apache.org> | 2001-07-18 21:16:40 +0000 |
---|---|---|
committer | Greg Ames <gregames@apache.org> | 2001-07-18 21:16:40 +0000 |
commit | 590a1bde986dde8f8a41fb651c1fef2aaddc7559 (patch) | |
tree | 82f2fe6b8d1eb6c51648fa7cea009d3402fe69fb | |
parent | db65b5a2a264f2430284423c93c1d92ef790ff1c (diff) | |
download | httpd-590a1bde986dde8f8a41fb651c1fef2aaddc7559.tar.gz |
fix memory leak of apr_sockaddr_t and apr_socket_t in ap_mpm_pod_signal,
called by perform_idle_server_maintenance.
allocate & init one apr_sockaddr_t for the dummy connect at pod open time.
use a temporary subpool for the apr_socket_t
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89612 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | include/mpm_common.h | 1 | ||||
-rw-r--r-- | server/mpm_common.c | 23 |
2 files changed, 19 insertions, 5 deletions
diff --git a/include/mpm_common.h b/include/mpm_common.h index f029225320..7ce2585661 100644 --- a/include/mpm_common.h +++ b/include/mpm_common.h @@ -172,6 +172,7 @@ struct ap_pod_t { apr_file_t *pod_in; apr_file_t *pod_out; apr_pool_t *p; + apr_sockaddr_t *sa; }; /** diff --git a/server/mpm_common.c b/server/mpm_common.c index c79eeb52a1..e077ed0164 100644 --- a/server/mpm_common.c +++ b/server/mpm_common.c @@ -347,9 +347,15 @@ AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod) *pod = apr_palloc(p, sizeof(**pod)); rv = apr_file_pipe_create(&((*pod)->pod_in), &((*pod)->pod_out), p); + if (rv != APR_SUCCESS) { + return rv; + } apr_file_pipe_timeout_set((*pod)->pod_in, 0); (*pod)->p = p; - return rv; + + apr_sockaddr_info_get(&(*pod)->sa, "127.0.0.1", APR_UNSPEC, ap_listeners->bind_addr->port, 0, p); + + return APR_SUCCESS; } AP_DECLARE(apr_status_t) ap_mpm_pod_check(ap_pod_t *pod) @@ -388,10 +394,10 @@ AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod) AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod) { apr_socket_t *sock; - apr_sockaddr_t *sa; apr_status_t rv; char char_of_death = '!'; apr_size_t one = 1; + apr_pool_t *p; do { rv = apr_file_write(pod->pod_out, &char_of_death, &one); @@ -401,9 +407,14 @@ AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod) "write pipe_of_death"); return rv; } + + /* create a temporary pool for the socket. pconf stays around too long */ + rv = apr_pool_create(&p, pod->p); + if (rv != APR_SUCCESS) { + return rv; + } - apr_sockaddr_info_get(&sa, "127.0.0.1", APR_UNSPEC, ap_listeners->bind_addr->port, 0, pod->p); - rv = apr_socket_create(&sock, sa->family, SOCK_STREAM, pod->p); + rv = apr_socket_create(&sock, pod->sa->family, SOCK_STREAM, p); if (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, "get socket to connect to listener"); @@ -421,7 +432,8 @@ AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod) "set timeout on socket to connect to listener"); return rv; } - rv = apr_connect(sock, sa); + + rv = apr_connect(sock, pod->sa); if (rv != APR_SUCCESS) { int log_level = APLOG_WARNING; @@ -438,6 +450,7 @@ AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod) return rv; } apr_socket_close(sock); + apr_pool_destroy(p); return APR_SUCCESS; } |