Commit ce0b029d authored by Greg Ames's avatar Greg Ames
Browse files

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
parent 76a234d1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
};

/**
+18 −5
Original line number Diff line number Diff line
@@ -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);
@@ -402,8 +408,13 @@ AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod)
        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);
    /* 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;
    }
    
    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;
}