From 02c44cf9dd3abfcc4bf02d5e8f24d89e1f11378c Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Thu, 19 Dec 2024 19:43:00 +0100 Subject: [PATCH 1/4] Add observer temporary to dl'ed functions --- Zend/zend_API.c | 9 ++++- ext/dl_test/dl_test.c | 18 ++++++++++ ext/dl_test/dl_test.stub.php | 4 +++ ext/dl_test/dl_test_arginfo.h | 21 ++++++++++- .../tests/general_functions/gh17211.phpt | 36 +++++++++++++++++++ 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 ext/standard/tests/general_functions/gh17211.phpt diff --git a/Zend/zend_API.c b/Zend/zend_API.c index eb6e349f7ec2..6aeb2d653faa 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2718,7 +2718,14 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend } internal_function->type = ZEND_INTERNAL_FUNCTION; internal_function->module = EG(current_module); - internal_function->T = 0; + if (EG(active) && ZEND_OBSERVER_ENABLED) { + /* Add an observer temporary to store previous observed frames. This is + * normally handled by zend_observer_post_startup(), except for + * functions registered at runtime (EG(active)). */ + internal_function->T = 1; + } else { + internal_function->T = 0; + } memset(internal_function->reserved, 0, ZEND_MAX_RESERVED_RESOURCES * sizeof(void*)); while (ptr->fname) { diff --git a/ext/dl_test/dl_test.c b/ext/dl_test/dl_test.c index f4a8ab8198ed..a4f42454c565 100644 --- a/ext/dl_test/dl_test.c +++ b/ext/dl_test/dl_test.c @@ -76,9 +76,27 @@ PHP_INI_BEGIN() PHP_INI_END() /* }}} */ +PHP_METHOD(DlTest, test) +{ + char *var = "World"; + size_t var_len = sizeof("World") - 1; + zend_string *retval; + + ZEND_PARSE_PARAMETERS_START(0, 1) + Z_PARAM_OPTIONAL + Z_PARAM_STRING(var, var_len) + ZEND_PARSE_PARAMETERS_END(); + + retval = strpprintf(0, "Hello %s", var); + + RETURN_STR(retval); +} + /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(dl_test) { + register_class_DlTest(); + /* Test backwards compatibility */ if (getenv("PHP_DL_TEST_USE_OLD_REGISTER_INI_ENTRIES")) { zend_register_ini_entries(ini_entries, module_number); diff --git a/ext/dl_test/dl_test.stub.php b/ext/dl_test/dl_test.stub.php index 524c8206365b..cd8b3916bae2 100644 --- a/ext/dl_test/dl_test.stub.php +++ b/ext/dl_test/dl_test.stub.php @@ -8,3 +8,7 @@ function dl_test_test1(): void {} function dl_test_test2(string $str = ""): string {} + +class DlTest { + public function test(string $str = ""): string {} +} diff --git a/ext/dl_test/dl_test_arginfo.h b/ext/dl_test/dl_test_arginfo.h index fdd0e3a89e10..0618bbdb222c 100644 --- a/ext/dl_test/dl_test_arginfo.h +++ b/ext/dl_test/dl_test_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 547ddbc21e9aa853b491cb17e902bbbb9cc2df00 */ + * Stub hash: 2dbacf5282b0f8e53923ac70495c2da43c7237e3 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dl_test_test1, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() @@ -8,9 +8,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dl_test_test2, 0, 0, IS_STRING, ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, str, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() +#define arginfo_class_DlTest_test arginfo_dl_test_test2 + ZEND_FUNCTION(dl_test_test1); ZEND_FUNCTION(dl_test_test2); +ZEND_METHOD(DlTest, test); static const zend_function_entry ext_functions[] = { @@ -18,3 +21,19 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(dl_test_test2, arginfo_dl_test_test2) ZEND_FE_END }; + + +static const zend_function_entry class_DlTest_methods[] = { + ZEND_ME(DlTest, test, arginfo_class_DlTest_test, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static zend_class_entry *register_class_DlTest(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "DlTest", class_DlTest_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + + return class_entry; +} diff --git a/ext/standard/tests/general_functions/gh17211.phpt b/ext/standard/tests/general_functions/gh17211.phpt new file mode 100644 index 000000000000..44f4d4ad32eb --- /dev/null +++ b/ext/standard/tests/general_functions/gh17211.phpt @@ -0,0 +1,36 @@ +--TEST-- +dl() / observer segfault +--EXTENSIONS-- +zend_test +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_functions=1 +--FILE-- +test("World!")); +?> +--EXPECTF-- + + +
+
+ + + + + +string(12) "Hello World!" + + + + + +string(12) "Hello World!" + From b0f28f9cee934ac9d2ec6579a1dabe1f558fe484 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Thu, 19 Dec 2024 20:28:04 +0100 Subject: [PATCH 2/4] Trigger build From 31de4f01a5745e9f7a11eb973a37fdf6e70ef81a Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 20 Dec 2024 13:12:44 +0100 Subject: [PATCH 3/4] Fix test --- ext/standard/tests/general_functions/gh17211.phpt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ext/standard/tests/general_functions/gh17211.phpt b/ext/standard/tests/general_functions/gh17211.phpt index 44f4d4ad32eb..e159fbb3b96c 100644 --- a/ext/standard/tests/general_functions/gh17211.phpt +++ b/ext/standard/tests/general_functions/gh17211.phpt @@ -7,9 +7,15 @@ zend_test --INI-- zend_test.observer.enabled=1 zend_test.observer.observe_functions=1 +zend_test.observer.show_output=1 --FILE-- Date: Fri, 20 Dec 2024 17:16:32 +0100 Subject: [PATCH 4/4] Fix test --- ext/standard/tests/general_functions/gh17211.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/general_functions/gh17211.phpt b/ext/standard/tests/general_functions/gh17211.phpt index e159fbb3b96c..5df8a6638a67 100644 --- a/ext/standard/tests/general_functions/gh17211.phpt +++ b/ext/standard/tests/general_functions/gh17211.phpt @@ -11,7 +11,7 @@ zend_test.observer.show_output=1 --FILE--