]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Do not send apr_file_t allocated out of the pconf pool down the
authorBill Stoddard <stoddard@apache.org>
Fri, 11 May 2001 17:34:17 +0000 (17:34 +0000)
committerBill Stoddard <stoddard@apache.org>
Fri, 11 May 2001 17:34:17 +0000 (17:34 +0000)
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

modules/cache/mod_file_cache.c

index 345a8e108b50bba7124e7c20c8b80af6f41fcba8..39f8b17ad0dd8eec772da077ea8ddad0dc0ee460 100644 (file)
@@ -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;