]> granicus.if.org Git - php/commitdiff
Fixed bug #45860 (header() function fails to correctly replace all Status lines)
authorDmitry Stogov <dmitry@php.net>
Tue, 2 Sep 2008 13:22:27 +0000 (13:22 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 2 Sep 2008 13:22:27 +0000 (13:22 +0000)
sapi/cgi/cgi_main.c
sapi/cgi/tests/010.phpt [new file with mode: 0644]

index 1776bb7ba6ef3c9c4bfbccb7e6187d8a5f411d1f..f49ac63f3ee6070a5789180040e6a0daa75210e4 100644 (file)
@@ -375,6 +375,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
        char buf[SAPI_CGI_MAX_HEADER_LENGTH];
        sapi_header_struct *h;
        zend_llist_position pos;
+       zend_bool ignore_status = 0;
 
        if (SG(request_info).no_headers == 1) {
                return  SAPI_HEADER_SENT_SUCCESSFULLY;
@@ -431,6 +432,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
 
                if (!has_status) {
                        PHPWRITE_H(buf, len);
+                       ignore_status = 1;
                }
        }
 
@@ -438,8 +440,17 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
        while (h) {
                /* prevent CRLFCRLF */
                if (h->header_len) {
-                       PHPWRITE_H(h->header, h->header_len);
-                       PHPWRITE_H("\r\n", 2);
+                       if (h->header_len > sizeof("Status:")-1 &&
+                           strncasecmp(h->header, "Status:", sizeof("Status:")-1) == 0) {
+                           if (!ignore_status) {
+                                   ignore_status = 1;
+                                       PHPWRITE_H(h->header, h->header_len);
+                                       PHPWRITE_H("\r\n", 2);
+                               }
+                       } else {
+                               PHPWRITE_H(h->header, h->header_len);
+                               PHPWRITE_H("\r\n", 2);
+                       }
                }
                h = (sapi_header_struct*)zend_llist_get_next_ex(&sapi_headers->headers, &pos);
        }
diff --git a/sapi/cgi/tests/010.phpt b/sapi/cgi/tests/010.phpt
new file mode 100644 (file)
index 0000000..1a58ba4
--- /dev/null
@@ -0,0 +1,53 @@
+--TEST--
+Bug #45860 (header() function fails to correctly replace all Status lines)
+--SKIPIF--
+<?php include "skipif.inc"; ?>
+--FILE--
+<?php
+
+include "include.inc";
+
+$php = get_cgi_path();
+reset_env_vars();
+
+$f = tempnam(sys_get_temp_dir(), 'cgitest');
+
+putenv("TRANSLATED_PATH=".$f."/x");
+putenv("SCRIPT_FILENAME=".$f."/x");
+file_put_contents($f, '<?php
+header("HTTP/1.1 403 Forbidden");
+header("Status: 403 Also Forbidden");
+?>');
+
+echo (`$php -n $f`);
+
+file_put_contents($f, '<?php
+header("HTTP/1.1 403 Forbidden");
+?>');
+
+echo (`$php -n $f`);
+
+file_put_contents($f, '<?php
+header("Status: 403 Also Forbidden");
+?>');
+
+echo (`$php -n $f`);
+
+echo "Done\n";
+
+@unlink($f);
+?>
+--EXPECTF--
+Status: 403 Forbidden
+X-Powered-By: PHP/%s
+Content-type: text/html%s
+
+Status: 403 Forbidden
+X-Powered-By: PHP/%s
+Content-type: text/html%s
+
+X-Powered-By: PHP/%s
+Status: 403 Also Forbidden
+Content-type: text/html%s
+
+Done