]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
avoid ap_set_content_type when processing a _Request_Header set|edit|unset Content...
authorYann Ylavic <ylavic@apache.org>
Tue, 10 Jun 2025 10:58:15 +0000 (10:58 +0000)
committerYann Ylavic <ylavic@apache.org>
Tue, 10 Jun 2025 10:58:15 +0000 (10:58 +0000)
identified by ylavic

Merges r1820750 from trunk
Submitted by: covener
Reviewed by: covener, rpluem, jorton

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

CHANGES
modules/metadata/mod_headers.c

diff --git a/CHANGES b/CHANGES
index b7bd6055425670e24b6d69da2d772e87711c8502..8fac45be5c56395aebb07ccef2ca6de0727a94b2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,11 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.4.64
 
+  *) mod_headers: 'RequestHeader set|edit|edit_r Content-Type X' could
+     inadvertently modify the Content-Type _response_ header. Applies to
+     Content-Type only and likely to only affect static file responses.
+     [Eric Covener]
+
   *) mod_ssl: Remove warning over potential uninitialised value
      for ssl protocol prior to protocol selection.
      [Graham Leggett]
index 4838bd6cd0dad416ec9228e740f4adcf755ce1bc..57da3fc538da9fd62571965e189987321c22e21d 100644 (file)
@@ -782,14 +782,16 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers,
             }
             break;
         case hdr_set:
-            if (!ap_cstr_casecmp(hdr->header, "Content-Type")) {
+            if (r->headers_in != headers &&
+                !ap_cstr_casecmp(hdr->header, "Content-Type")) {
                  ap_set_content_type_ex(r, process_tags(hdr, r), 1);
             }
             apr_table_setn(headers, hdr->header, process_tags(hdr, r));
             break;
         case hdr_setifempty:
             if (NULL == apr_table_get(headers, hdr->header)) {
-                if (!ap_cstr_casecmp(hdr->header, "Content-Type")) {
+                if (r->headers_in != headers &&
+                    !ap_cstr_casecmp(hdr->header, "Content-Type")) {
                     ap_set_content_type_ex(r, process_tags(hdr, r), 1);
                 }
                 apr_table_setn(headers, hdr->header, process_tags(hdr, r));
@@ -797,6 +799,10 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers,
             break;
         case hdr_unset:
             apr_table_unset(headers, hdr->header);
+            if (r->headers_in != headers &&
+                !ap_cstr_casecmp(hdr->header, "Content-Type")) {
+                ap_set_content_type(r, NULL);
+            }
             break;
         case hdr_echo:
             v.r = r;
@@ -809,7 +815,7 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers,
                 const char *repl = process_regexp(hdr, r->content_type, r);
                 if (repl == NULL)
                     return 0;
-                ap_set_content_type_ex(r, repl, 1);
+                if (r->headers_in != headers) ap_set_content_type_ex(r, repl, 1);
             }
             if (apr_table_get(headers, hdr->header)) {
                 edit_do ed;