diff options
| author | Xinchen Hui <laruence@gmail.com> | 2016-12-29 15:56:38 +0800 |
|---|---|---|
| committer | Xinchen Hui <laruence@gmail.com> | 2016-12-29 15:56:38 +0800 |
| commit | 40727d7ce90cbd0a878216c2f666660565934bdc (patch) | |
| tree | f4693a417297790d49c17e983c2b509b40816f5e /sapi/apache2handler/sapi_apache2.c | |
| parent | e2a159fe01b4b4e09569836f409c215ff4546239 (diff) | |
| parent | 716fa9c24d8acc0bf1284a93b06a1b2c841e5a9e (diff) | |
| download | php-git-40727d7ce90cbd0a878216c2f666660565934bdc.tar.gz | |
Merge branch 'PHP-7.1'
* PHP-7.1:
define php_ap_map_http_request_error function for older httpd only
add old versions of httpd support
typo fixed
bug fixed #61471 in apache2handler
Diffstat (limited to 'sapi/apache2handler/sapi_apache2.c')
| -rw-r--r-- | sapi/apache2handler/sapi_apache2.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index 8fe7dab3b5..9f06588674 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -65,6 +65,33 @@ char *apache2_php_ini_path_override = NULL; ZEND_TSRMLS_CACHE_DEFINE() #endif +/* if apache's version is newer than 2.2.31 or 2.4.16 */ +#if MODULE_MAGIC_COOKIE == 0x41503232UL && AP_MODULE_MAGIC_AT_LEAST(20051115,40) || \ + MODULE_MAGIC_COOKIE == 0x41503234UL && AP_MODULE_MAGIC_AT_LEAST(20120211,47) +#define php_ap_map_http_request_error ap_map_http_request_error +#else +static int php_ap_map_http_request_error(apr_status_t rv, int status) +{ + switch (rv) { + case AP_FILTER_ERROR: { + return AP_FILTER_ERROR; + } + case APR_ENOSPC: { + return HTTP_REQUEST_ENTITY_TOO_LARGE; + } + case APR_ENOTIMPL: { + return HTTP_NOT_IMPLEMENTED; + } + case APR_ETIMEDOUT: { + return HTTP_REQUEST_TIME_OUT; + } + default: { + return status; + } + } +} +#endif + static size_t php_apache_sapi_ub_write(const char *str, size_t str_length) { @@ -180,6 +207,7 @@ php_apache_sapi_read_post(char *buf, size_t count_bytes) php_struct *ctx = SG(server_context); request_rec *r; apr_bucket_brigade *brigade; + apr_status_t ret; r = ctx->r; brigade = ctx->brigade; @@ -191,7 +219,7 @@ php_apache_sapi_read_post(char *buf, size_t count_bytes) * need to make sure that if data is available we fill the buffer completely. */ - while (ap_get_brigade(r->input_filters, brigade, AP_MODE_READBYTES, APR_BLOCK_READ, len) == APR_SUCCESS) { + while ((ret=ap_get_brigade(r->input_filters, brigade, AP_MODE_READBYTES, APR_BLOCK_READ, len)) == APR_SUCCESS) { apr_brigade_flatten(brigade, buf, &len); apr_brigade_cleanup(brigade); tlen += len; @@ -202,6 +230,14 @@ php_apache_sapi_read_post(char *buf, size_t count_bytes) len = count_bytes - tlen; } + if (ret != APR_SUCCESS) { + if (APR_STATUS_IS_TIMEUP(ret)) { + SG(sapi_headers).http_response_code = php_ap_map_http_request_error(ret, HTTP_REQUEST_TIME_OUT); + } else { + SG(sapi_headers).http_response_code = php_ap_map_http_request_error(ret, HTTP_BAD_REQUEST); + } + } + return tlen; } @@ -679,6 +715,13 @@ zend_first_try { brigade = ctx->brigade; } + if (SG(request_info).content_length > SG(read_post_bytes)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Error while attempting to read POST data: %d", SG(sapi_headers).http_response_code); + apr_brigade_cleanup(brigade); + PHPAP_INI_OFF; + return SG(sapi_headers).http_response_code; + } + if (AP2(last_modified)) { ap_update_mtime(r, r->finfo.mtime); ap_set_last_modified(r); |
