Commit d1151255 authored by Bill Stoddard's avatar Bill Stoddard
Browse files

Do not send apr_file_t allocated out of the pconf pool down the

filter chain.  This is not perfect but better. Need to do some
more work in apr_os_file_put to initialize fields a bit better.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89086 13f79535-47bb-0310-9956-ffa450edef68
parent f94cfbd1
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -328,6 +328,8 @@ static int sendfile_handler(request_rec *r, a_file *file)
#if APR_HAS_SENDFILE
    apr_size_t nbytes;
    apr_status_t rv = APR_EINIT;
    apr_file_t *rfile;
    apr_os_file_t fd;

    /* A cached file handle (more importantly, its file pointer) is 
     * shared by all threads in the process. The file pointer will 
@@ -350,8 +352,14 @@ static int sendfile_handler(request_rec *r, a_file *file)
            return DECLINED;
    }


    rv = ap_send_fd(file->file, r, 0, file->finfo.size, &nbytes);
    /* Create an apr_file_t anchored out of the request pool to use 
     * on the call to ap_send_fd(). The cached apr_file_t is allocated 
     * out of pconf (a life of the server pool) and sending it down
     * the filter chain could cause memory leaks.
     */
    apr_os_file_get(&fd, file->file);
    apr_os_file_put(&rfile, &fd, r->pool);
    rv = ap_send_fd(rfile, r, 0, file->finfo.size, &nbytes);
    if (rv != APR_SUCCESS) {
        /* ap_send_fd will log the error */
        return HTTP_INTERNAL_SERVER_ERROR;