From 2744a044e76809b1dba880660d749272433ce035 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 13 Aug 2022 15:32:25 +0100 Subject: [PATCH 1/3] Add zend_string INI validators Currently we only have validators for char* which is rather annoying as INI settings are saved as zend_string* in the first place --- Zend/zend_ini.c | 20 +++++++++++ Zend/zend_ini.h | 4 +++ ext/zend_test/php_test.h | 2 ++ ext/zend_test/test.c | 9 +++++ ext/zend_test/test.stub.php | 2 ++ ext/zend_test/test_arginfo.h | 6 +++- .../tests/zend_ini_str_validator_basic.phpt | 33 +++++++++++++++++++ ...nd_ini_str_validator_return_from_func.phpt | 10 ++++++ 8 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 ext/zend_test/tests/zend_ini_str_validator_basic.phpt create mode 100644 ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index ee42093c988b0..efade220a530f 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -876,3 +876,23 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */ return SUCCESS; } /* }}} */ + +ZEND_API ZEND_INI_MH(OnUpdateStr) /* {{{ */ +{ + zend_string **p = (zend_string **) ZEND_INI_GET_ADDR(); + *p = new_value ? new_value : NULL; + return SUCCESS; +} +/* }}} */ + +ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty) /* {{{ */ +{ + if (new_value && ZSTR_LEN(new_value) == 0) { + return FAILURE; + } + + zend_string **p = (zend_string **) ZEND_INI_GET_ADDR(); + *p = new_value ? new_value : NULL; + return SUCCESS; +} +/* }}} */ diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index a371b285764d6..56939fa9ea8cb 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -209,8 +209,12 @@ ZEND_API ZEND_INI_MH(OnUpdateBool); ZEND_API ZEND_INI_MH(OnUpdateLong); ZEND_API ZEND_INI_MH(OnUpdateLongGEZero); ZEND_API ZEND_INI_MH(OnUpdateReal); +/* char* versions */ ZEND_API ZEND_INI_MH(OnUpdateString); ZEND_API ZEND_INI_MH(OnUpdateStringUnempty); +/* zend_string* versions */ +ZEND_API ZEND_INI_MH(OnUpdateStr); +ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty); END_EXTERN_C() #define ZEND_INI_DISPLAY_ORIG 1 diff --git a/ext/zend_test/php_test.h b/ext/zend_test/php_test.h index 1c0b24f0d0849..ccad359c49b23 100644 --- a/ext/zend_test/php_test.h +++ b/ext/zend_test/php_test.h @@ -54,6 +54,8 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test) bool print_stderr_mshutdown; zend_test_fiber *active_fiber; zend_long quantity_value; + zend_string *str_test; + zend_string *not_empty_str_test; ZEND_END_MODULE_GLOBALS(zend_test) extern ZEND_DECLARE_MODULE_GLOBALS(zend_test) diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 9852887ef74b1..a27fb47168317 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -415,6 +415,13 @@ static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity) } } +static ZEND_FUNCTION(zend_test_zend_ini_str) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + RETURN_STR(ZT_G(str_test)); +} + static ZEND_FUNCTION(namespaced_func) { ZEND_PARSE_PARAMETERS_NONE(); @@ -616,6 +623,8 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.print_stderr_mshutdown", "0", PHP_INI_SYSTEM, OnUpdateBool, print_stderr_mshutdown, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_ENTRY("zend_test.quantity_value", "0", PHP_INI_ALL, OnUpdateLong, quantity_value, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_ENTRY("zend_test.str_test", "", PHP_INI_ALL, OnUpdateStr, str_test, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_ENTRY("zend_test.not_empty_str_test", "val", PHP_INI_ALL, OnUpdateStrNotEmpty, not_empty_str_test, zend_zend_test_globals, zend_test_globals) PHP_INI_END() void (*old_zend_execute_ex)(zend_execute_data *execute_data); diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 45bbaedfc32ca..0da46a746b3fa 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -143,6 +143,8 @@ function zend_call_method(object|string $obj_or_class, string $method, mixed $ar function zend_test_zend_ini_parse_quantity(string $str): int {} function zend_test_zend_ini_parse_uquantity(string $str): int {} + + function zend_test_zend_ini_str(): string {} } namespace ZendTestNS { diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 6ea5277061d90..86bff92433aa9 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: daa7be53e9009c66c814fb5b0407a6dfbe09679a */ + * Stub hash: 09e36fb87531b6ac8261c9ed0faa755a1c144638 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -91,6 +91,8 @@ ZEND_END_ARG_INFO() #define arginfo_zend_test_zend_ini_parse_uquantity arginfo_zend_test_zend_ini_parse_quantity +#define arginfo_zend_test_zend_ini_str arginfo_zend_get_current_func_name + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ZendTestNS2_ZendSubNS_namespaced_func, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() @@ -162,6 +164,7 @@ static ZEND_FUNCTION(zend_get_current_func_name); static ZEND_FUNCTION(zend_call_method); static ZEND_FUNCTION(zend_test_zend_ini_parse_quantity); static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity); +static ZEND_FUNCTION(zend_test_zend_ini_str); static ZEND_FUNCTION(namespaced_func); static ZEND_METHOD(_ZendTestClass, is_object); static ZEND_METHOD(_ZendTestClass, __toString); @@ -205,6 +208,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_call_method, arginfo_zend_call_method) ZEND_FE(zend_test_zend_ini_parse_quantity, arginfo_zend_test_zend_ini_parse_quantity) ZEND_FE(zend_test_zend_ini_parse_uquantity, arginfo_zend_test_zend_ini_parse_uquantity) + ZEND_FE(zend_test_zend_ini_str, arginfo_zend_test_zend_ini_str) ZEND_NS_FE("ZendTestNS2\\ZendSubNS", namespaced_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_func) ZEND_FE_END }; diff --git a/ext/zend_test/tests/zend_ini_str_validator_basic.phpt b/ext/zend_test/tests/zend_ini_str_validator_basic.phpt new file mode 100644 index 0000000000000..ab1133dd6d2e8 --- /dev/null +++ b/ext/zend_test/tests/zend_ini_str_validator_basic.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test OnUpdateStr and OnUpdateStrNotEmpty validators. +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +str_test INI +string(0) "" +string(0) "" +string(4) "Test" +string(4) "Test" +string(0) "" +not_empty_str_test INI +string(3) "val" +string(3) "val" +string(4) "Test" +bool(false) +string(4) "Test" diff --git a/ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt b/ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt new file mode 100644 index 0000000000000..a02748f6d8a5a --- /dev/null +++ b/ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt @@ -0,0 +1,10 @@ +--TEST-- +Test zend_test_zend_ini_str() to check for GC refcount on global returned +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +string(0) "" From 1c112769c24f55532616008725e440d038123ace Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 19 Aug 2022 13:09:10 +0100 Subject: [PATCH 2/3] Simplify code logic Co-authored-by: Christoph M. Becker --- Zend/zend_ini.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index efade220a530f..2e4c6f0f21c75 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -880,7 +880,7 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */ ZEND_API ZEND_INI_MH(OnUpdateStr) /* {{{ */ { zend_string **p = (zend_string **) ZEND_INI_GET_ADDR(); - *p = new_value ? new_value : NULL; + *p = new_value; return SUCCESS; } /* }}} */ From 860b418e5c4575092725a80def909317bf61a872 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 19 Aug 2022 13:11:30 +0100 Subject: [PATCH 3/3] Simplify in a similar fashion --- Zend/zend_ini.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index 2e4c6f0f21c75..2086665e04fb3 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -892,7 +892,7 @@ ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty) /* {{{ */ } zend_string **p = (zend_string **) ZEND_INI_GET_ADDR(); - *p = new_value ? new_value : NULL; + *p = new_value; return SUCCESS; } /* }}} */