httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From n..@apache.org
Subject svn commit: r370692 - /httpd/httpd/trunk/server/util_script.c
Date Fri, 20 Jan 2006 01:36:46 GMT
Author: niq
Date: Thu Jan 19 17:36:44 2006
New Revision: 370692

URL: http://svn.apache.org/viewcvs?rev=370692&view=rev
Log:
PR#38070: When a CGI script emits an explicit "Status:" header,
it takes charge, so we shouldn't use ap_meets_conditions.

Modified:
    httpd/httpd/trunk/server/util_script.c

Modified: httpd/httpd/trunk/server/util_script.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/server/util_script.c?rev=370692&r1=370691&r2=370692&view=diff
==============================================================================
--- httpd/httpd/trunk/server/util_script.c (original)
+++ httpd/httpd/trunk/server/util_script.c Thu Jan 19 17:36:44 2006
@@ -398,6 +398,8 @@
     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 @@
     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 @@
         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,



Mime
View raw message