Browse Source

Fixed bug #45860 (header() function fails to correctly replace all Status lines)

PECL
Dmitry Stogov 18 years ago
parent
commit
51eb7f5de9
  1. 15
      sapi/cgi/cgi_main.c
  2. 53
      sapi/cgi/tests/010.phpt

15
sapi/cgi/cgi_main.c

@ -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;
@ -430,6 +431,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
}
if (!has_status) {
PHPWRITE_H(buf, len);
ignore_status = 1;
}
}
@ -437,8 +439,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);
}

53
sapi/cgi/tests/010.phpt

@ -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
Status: 403 Forbidden
X-Powered-By: PHP/%s
Content-type: text/html
X-Powered-By: PHP/%s
Status: 403 Also Forbidden
Content-type: text/html
Done
Loading…
Cancel
Save