From: Michael Wallner Date: Tue, 26 Nov 2013 14:03:37 +0000 (+0100) Subject: re-introduce always_populate_raw_post_data X-Git-Tag: php-5.6.0alpha1~66 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3641507fc1a854ec56135740f528d5d428920833;p=php re-introduce always_populate_raw_post_data --- diff --git a/main/main.c b/main/main.c index 04338e76c7..fdcf2b0a5b 100644 --- a/main/main.c +++ b/main/main.c @@ -460,6 +460,37 @@ static PHP_INI_MH(OnChangeMailForceExtra) /* defined in browscap.c */ PHP_INI_MH(OnChangeBrowscap); +/* {{{ PHP_INI_MH + */ +static PHP_INI_MH(OnChangeAlwaysPopulateRawPostData) +{ + signed char *p; +#ifndef ZTS + char *base = (char *) mh_arg2; +#else + char *base; + + base = (char *) ts_resource(*((int *) mh_arg2)); +#endif + + p = (signed char *) (base+(size_t) mh_arg1); + + *p = zend_atol(new_value, new_value_length); + if (new_value_length == 2 && strcasecmp("on", new_value) == 0) { + *p = (signed char) 1; + } + else if (new_value_length == 3 && strcasecmp("yes", new_value) == 0) { + *p = (signed char) 1; + } + else if (new_value_length == 4 && strcasecmp("true", new_value) == 0) { + *p = (signed char) 1; + } + else { + *p = (signed char) atoi(new_value); + } + return SUCCESS; +} +/* }}} */ /* Need to be read from the environment (?): * PHP_AUTO_PREPEND_FILE @@ -562,6 +593,7 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("allow_url_include", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_url_include, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("enable_post_data_reading", "1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, enable_post_data_reading, php_core_globals, core_globals) + STD_PHP_INI_BOOLEAN("always_populate_raw_post_data","0",PHP_INI_SYSTEM|PHP_INI_PERDIR, OnChangeAlwaysPopulateRawPostData, always_populate_raw_post_data, php_core_globals, core_globals) STD_PHP_INI_ENTRY("realpath_cache_size", "16K", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_size_limit, virtual_cwd_globals, cwd_globals) STD_PHP_INI_ENTRY("realpath_cache_ttl", "120", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_ttl, virtual_cwd_globals, cwd_globals) diff --git a/main/php_content_types.c b/main/php_content_types.c index 3346efc50e..d15f6a709d 100644 --- a/main/php_content_types.c +++ b/main/php_content_types.c @@ -33,6 +33,19 @@ static sapi_post_entry php_post_entries[] = { }; /* }}} */ +static zend_bool populate_raw_post_data(TSRMLS_D) +{ + if (!SG(request_info).request_body) { + return (zend_bool) 0; + } + + if (!PG(always_populate_raw_post_data)) { + return (zend_bool) !SG(request_info).post_entry; + } + + return (zend_bool) (PG(always_populate_raw_post_data) > 0); +} + /* {{{ SAPI_POST_READER_FUNC */ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader) @@ -42,6 +55,17 @@ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader) /* no post handler registered, so we just swallow the data */ sapi_read_standard_form_data(TSRMLS_C); } + + if (populate_raw_post_data(TSRMLS_C)) { + size_t length; + char *data = NULL; + + php_stream_rewind(SG(request_info).request_body); + length = php_stream_copy_to_mem(SG(request_info).request_body, &data, PHP_STREAM_COPY_ALL, 0); + php_stream_rewind(SG(request_info).request_body); + + SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, length); + } } } /* }}} */ diff --git a/main/php_globals.h b/main/php_globals.h index fa2fe3b232..49647b0a55 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -132,6 +132,7 @@ struct _php_core_globals { zend_bool allow_url_fopen; zend_bool enable_post_data_reading; zend_bool report_zend_debug; + long always_populate_raw_post_data; int last_error_type; char *last_error_message; diff --git a/tests/basic/024.phpt b/tests/basic/024.phpt new file mode 100644 index 0000000000..bf8a206b3a --- /dev/null +++ b/tests/basic/024.phpt @@ -0,0 +1,28 @@ +--TEST-- +Test HTTP_RAW_POST_DATA creation +--INI-- +always_populate_raw_post_data=1 +max_input_vars=1000 +--POST-- +a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3 +--FILE-- + +--EXPECT-- +array(3) { + ["a"]=> + string(3) "ABC" + ["y"]=> + string(3) "XYZ" + ["c"]=> + array(3) { + [0]=> + string(1) "1" + [1]=> + string(1) "2" + ["a"]=> + string(1) "3" + } +} +string(30) "a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3" diff --git a/tests/basic/026.phpt b/tests/basic/026.phpt new file mode 100644 index 0000000000..b98a31f430 --- /dev/null +++ b/tests/basic/026.phpt @@ -0,0 +1,15 @@ +--TEST-- +Registration of HTTP_RAW_POST_DATA due to unknown content-type +--INI-- +always_populate_raw_post_data=0 +--POST_RAW-- +Content-Type: unknown/type +a=1&b=ZYX +--FILE-- + +--EXPECT-- +array(0) { +} +string(9) "a=1&b=ZYX"