From: Bill Stoddard Date: Fri, 11 May 2001 17:34:17 +0000 (+0000) Subject: Do not send apr_file_t allocated out of the pconf pool down the X-Git-Tag: 2.0.18~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c13afe3fd50058fb38dce6d4901044702f86f9e0;p=thirdparty%2Fapache%2Fhttpd.git 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 --- diff --git a/modules/cache/mod_file_cache.c b/modules/cache/mod_file_cache.c index 345a8e108b5..39f8b17ad0d 100644 --- a/modules/cache/mod_file_cache.c +++ b/modules/cache/mod_file_cache.c @@ -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;