]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
fix memory leak of apr_sockaddr_t and apr_socket_t in ap_mpm_pod_signal,
authorGreg Ames <gregames@apache.org>
Wed, 18 Jul 2001 21:16:40 +0000 (21:16 +0000)
committerGreg Ames <gregames@apache.org>
Wed, 18 Jul 2001 21:16:40 +0000 (21:16 +0000)
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

include/mpm_common.h
server/mpm_common.c

index f029225320c821d3dee819efa8eaeefbeac2623d..7ce25856610a61642339bc44fb95fcb364925c7d 100644 (file)
@@ -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;
 };
 
 /**
index c79eeb52a166891bd53ccefafdf7289d6a460321..e077ed0164593f6bca188ceaecf49f7e87f38778 100644 (file)
@@ -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;
 }