summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Ames <gregames@apache.org>2001-07-18 21:16:40 +0000
committerGreg Ames <gregames@apache.org>2001-07-18 21:16:40 +0000
commit590a1bde986dde8f8a41fb651c1fef2aaddc7559 (patch)
tree82f2fe6b8d1eb6c51648fa7cea009d3402fe69fb
parentdb65b5a2a264f2430284423c93c1d92ef790ff1c (diff)
downloadhttpd-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.h1
-rw-r--r--server/mpm_common.c23
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;
}