summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2006-02-15 11:13:05 +0000
committerAntony Dovgal <tony2001@php.net>2006-02-15 11:13:05 +0000
commit9bb28ce1b7c4527d636d1bc07b41364946254ef4 (patch)
tree695c0df90909db46a9bf0a0a6b2d359deb23076e
parentccef27192e59e588061b524681198ff8afe9bfbc (diff)
downloadphp-git-9bb28ce1b7c4527d636d1bc07b41364946254ef4.tar.gz
MFH: fix #36400 (Custom 5xx error does not return correct HTTP response error code)
-rw-r--r--NEWS2
-rw-r--r--sapi/apache/mod_php5.c21
2 files changed, 22 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index c647e61314..240997c066 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ PHP NEWS
- Fixed an error in mysqli_fetch_fields (returned NULL instead of an
array when row number > field_count). (Georg)
- Renamed CachingRecursiveIterator to RecursiveCachingIterator. (Marcus)
+- Fixed bug #36400 (Custom 5xx error does not return correct HTTP response
+ error code). (Tony)
- Fixed bug #36303 (foreach on error_zval produces segfault). (Dmitry)
- Fixed bug #36205 (Memory leaks on duplicate cookies). (Dmitry)
- Fixed bug #36071 (Engine Crash related with 'clone'). (Dmitry)
diff --git a/sapi/apache/mod_php5.c b/sapi/apache/mod_php5.c
index bef6ea8fb6..f07e355de7 100644
--- a/sapi/apache/mod_php5.c
+++ b/sapi/apache/mod_php5.c
@@ -67,6 +67,7 @@ static CONST_PREFIX char *php_apache_admin_flag_handler(cmd_parms *cmd, HashTabl
/* ### these should be defined in mod_php5.h or somewhere else */
#define USE_PATH 1
#define IGNORE_URL 2
+#define MAX_STATUS_LENGTH sizeof("xxxx LONGEST POSSIBLE STATUS DESCRIPTION")
module MODULE_VAR_EXPORT php5_module;
@@ -208,17 +209,35 @@ static int sapi_apache_header_handler(sapi_header_struct *sapi_header, sapi_head
static int sapi_apache_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
{
request_rec *r = SG(server_context);
+ char *status_buf = NULL;
+ const char *sline = SG(sapi_headers).http_status_line;
+ int sline_len;
if(r == NULL) { /* server_context is not here anymore */
return SAPI_HEADER_SEND_FAILED;
}
r->status = SG(sapi_headers).http_response_code;
+
+ /* httpd requires that r->status_line is set to the first digit of
+ * the status-code: */
+ if (sline && ((sline_len = strlen(sline)) > 12) && strncmp(sline, "HTTP/1.", 7) == 0 && sline[8] == ' ' && sline[12] == ' ') {
+ if ((sline_len - 9) > MAX_STATUS_LENGTH) {
+ status_buf = estrndup(sline + 9, MAX_STATUS_LENGTH);
+ } else {
+ status_buf = estrndup(sline + 9, sline_len - 9);
+ }
+ r->status_line = status_buf;
+ }
+
if(r->status==304) {
send_error_response(r,0);
} else {
send_http_header(r);
- }
+ }
+ if (status_buf) {
+ efree(status_buf);
+ }
return SAPI_HEADER_SENT_SUCCESSFULLY;
}
/* }}} */