]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r1878280 from trunk:
authorYann Ylavic <ylavic@apache.org>
Fri, 26 Jun 2020 10:21:19 +0000 (10:21 +0000)
committerYann Ylavic <ylavic@apache.org>
Fri, 26 Jun 2020 10:21:19 +0000 (10:21 +0000)
mod_proxy_http: don't strip EOS when spooling request body to file.

To prevent stream_reqbody() from sending the FILE and FLUSH bucket in separate
brigades, and thus apr_file_setaside() to trigger if network congestion occurs
with the backend, restore the EOS in spool_reqbody_cl() which was stripped
when spooling the request body to a file.

Until APR r1878279 is released (and installed by users), apr_file_setaside()
on a temporary file (mktemp) will simply drop the file cleanup, leaking the
fd and inode..

This fixes BZ 64452.

Submitted by: ylavic
Reviewed by: ylavic, jorton, rpluem

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1879226 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/proxy/mod_proxy_http.c

diff --git a/CHANGES b/CHANGES
index 83f38e681c8ff153d1b9e71eaccda366989ec787..40fa12e9c38c21505648a3bceee5d45de42d657c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.4.44
 
+  *) mod_proxy_http: flush spooled request body in one go to avoid
+     leaking (or long lived) temporary file. PR 64452. [Yann Ylavic]
+
   *) mod_ssl: Fix a race condition and possible crash when using a proxy client
      certificate (SSLProxyMachineCertificateFile).
      [Armin Abfalterer <a.abfalterer gmail.com>]
index e94bf26d4124f248b7e9fef6da5210a46cf55d86..7a0f063f705fe6c238c875055b7fdd511d2feb21 100644 (file)
@@ -548,6 +548,14 @@ static int spool_reqbody_cl(proxy_http_req_t *req, apr_off_t *bytes_spooled)
         e = apr_bucket_immortal_create(CRLF_ASCII, 2, bucket_alloc);
         APR_BRIGADE_INSERT_TAIL(input_brigade, e);
     }
+    if (tmpfile) {
+        /* We dropped metadata buckets when spooling to tmpfile,
+         * terminate with EOS for stream_reqbody() to flush the
+         * whole in one go.
+         */
+        e = apr_bucket_eos_create(bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(input_brigade, e);
+    }
     return OK;
 }