]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Fix PR#38070
authorNick Kew <niq@apache.org>
Sat, 4 Feb 2006 17:45:51 +0000 (17:45 +0000)
committerNick Kew <niq@apache.org>
Sat, 4 Feb 2006 17:45:51 +0000 (17:45 +0000)
Avoid server-driven negotiation when a script has sent a Status: header.

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

CHANGES
STATUS
server/util_script.c

diff --git a/CHANGES b/CHANGES
index 1a3b8b0505bbd7a4355edc5f65b51b982f5b27b7..79cebe577ee570e010561995d3caa0a2ee47dca8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                         -*- coding: utf-8 -*-
 Changes with Apache 2.2.1
 
+  *) PR#38070: Avoid Server-driven negotiation when a script has
+     emitted an explicit Status: header.
+
   *) Fix to avoid feeding C99 to C++ compilers [Joe Orton]
 
   *) SECURITY: CVE-2005-3357 (cve.mitre.org)
diff --git a/STATUS b/STATUS
index c3c3307b748ef06a095374f2409b98ae68cf739d..35938b81cb5a142aa70cecc29e6f5827a5b1dabc 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -180,10 +180,6 @@ PATCHES PROPOSED TO BACKPORT FROM TRUNK:
       +1: rpluem, niq
       NOTE: this also supersedes previous fix to PR#37790
 
-    * util_script: Fix PR#38070 - Honour a CGI Status header correctly
-      http://svn.apache.org/viewcvs?rev=370692&view=rev
-      +1: niq, colm, wrowe
-
     * Solaris build proposal; don't fail on missing .h files within
       a VPATH build, and don't test trees with -d (simply -f the
       expected files) in case a tree such as srclib/apr is actually
index 66b9a95de67012d6ebda40e61e7faaea1963d6a3..c069bbb8ff1d121eabebbdabccd7245d06dde8f9 100644 (file)
@@ -398,6 +398,8 @@ static int set_cookie_doo_doo(void *v, const char *key, const char *val)
     return 1;
 }
 
+#define HTTP_UNSET (-HTTP_OK)
+
 AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer,
                                        int (*getsfunc) (char *, int, void *),
                                        void *getsfunc_data)
@@ -405,7 +407,7 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer,
     char x[MAX_STRING_LEN];
     char *w, *l;
     int p;
-    int cgi_status = HTTP_OK;
+    int cgi_status = HTTP_UNSET;
     apr_table_t *merge;
     apr_table_t *cookie_table;
 
@@ -466,7 +468,18 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer,
         if (w[0] == '\0') {
             int cond_status = OK;
 
-            if ((cgi_status == HTTP_OK) && (r->method_number == M_GET)) {
+           /* PR#38070: This fails because it gets confused when a
+            * CGI Status header overrides ap_meets_conditions.
+            * 
+            * We can fix that by dropping ap_meets_conditions when
+            * Status has been set.  Since this is the only place
+            * cgi_status gets used, let's test it explicitly.
+            *
+            * The alternative would be to ignore CGI Status when
+            * ap_meets_conditions returns anything interesting.
+            * That would be safer wrt HTTP, but would break CGI.
+            */
+            if ((cgi_status == HTTP_UNSET) && (r->method_number == M_GET)) {
                 cond_status = ap_meets_conditions(r);
             }
             apr_table_overlap(r->err_headers_out, merge,