@@ -69,6 +69,33 @@ char *apache2_php_ini_path_override = NULL;
69
69
ZEND_TSRMLS_CACHE_DEFINE ()
70
70
#endif
71
71
72
+ /* if apache's version is newer than 2.2.31 or 2.4.16 */
73
+ #if MODULE_MAGIC_COOKIE == 0x41503232UL && AP_MODULE_MAGIC_AT_LEAST (20051115 ,40 ) || \
74
+ MODULE_MAGIC_COOKIE == 0x41503234UL && AP_MODULE_MAGIC_AT_LEAST (20120211 ,47 )
75
+ #define php_ap_map_http_request_error ap_map_http_request_error
76
+ #else
77
+ static int php_ap_map_http_request_error (apr_status_t rv , int status )
78
+ {
79
+ switch (rv ) {
80
+ case AP_FILTER_ERROR : {
81
+ return AP_FILTER_ERROR ;
82
+ }
83
+ case APR_ENOSPC : {
84
+ return HTTP_REQUEST_ENTITY_TOO_LARGE ;
85
+ }
86
+ case APR_ENOTIMPL : {
87
+ return HTTP_NOT_IMPLEMENTED ;
88
+ }
89
+ case APR_ETIMEDOUT : {
90
+ return HTTP_REQUEST_TIME_OUT ;
91
+ }
92
+ default : {
93
+ return status ;
94
+ }
95
+ }
96
+ }
97
+ #endif
98
+
72
99
static size_t
73
100
php_apache_sapi_ub_write (const char * str , size_t str_length )
74
101
{
@@ -184,6 +211,7 @@ php_apache_sapi_read_post(char *buf, size_t count_bytes)
184
211
php_struct * ctx = SG (server_context );
185
212
request_rec * r ;
186
213
apr_bucket_brigade * brigade ;
214
+ apr_status_t ret ;
187
215
188
216
r = ctx -> r ;
189
217
brigade = ctx -> brigade ;
@@ -195,7 +223,7 @@ php_apache_sapi_read_post(char *buf, size_t count_bytes)
195
223
* need to make sure that if data is available we fill the buffer completely.
196
224
*/
197
225
198
- while (ap_get_brigade (r -> input_filters , brigade , AP_MODE_READBYTES , APR_BLOCK_READ , len ) == APR_SUCCESS ) {
226
+ while (( ret = ap_get_brigade (r -> input_filters , brigade , AP_MODE_READBYTES , APR_BLOCK_READ , len ) ) == APR_SUCCESS ) {
199
227
apr_brigade_flatten (brigade , buf , & len );
200
228
apr_brigade_cleanup (brigade );
201
229
tlen += len ;
@@ -206,6 +234,14 @@ php_apache_sapi_read_post(char *buf, size_t count_bytes)
206
234
len = count_bytes - tlen ;
207
235
}
208
236
237
+ if (ret != APR_SUCCESS ) {
238
+ if (APR_STATUS_IS_TIMEUP (ret )) {
239
+ SG (sapi_headers ).http_response_code = php_ap_map_http_request_error (ret , HTTP_REQUEST_TIME_OUT );
240
+ } else {
241
+ SG (sapi_headers ).http_response_code = php_ap_map_http_request_error (ret , HTTP_BAD_REQUEST );
242
+ }
243
+ }
244
+
209
245
return tlen ;
210
246
}
211
247
@@ -690,6 +726,13 @@ zend_first_try {
690
726
brigade = ctx -> brigade ;
691
727
}
692
728
729
+ if (SG (request_info ).content_length > SG (read_post_bytes )) {
730
+ ap_log_rerror (APLOG_MARK , APLOG_ERR , 0 , r , "Error while attempting to read POST data: %d" , SG (sapi_headers ).http_response_code );
731
+ apr_brigade_cleanup (brigade );
732
+ PHPAP_INI_OFF ;
733
+ return SG (sapi_headers ).http_response_code ;
734
+ }
735
+
693
736
if (AP2 (last_modified )) {
694
737
ap_update_mtime (r , r -> finfo .mtime );
695
738
ap_set_last_modified (r );
0 commit comments