Skip to content

Commit 5acd417

Browse files
moved from function call to INI setting, so we can use this in other places as well
1 parent 0e40a22 commit 5acd417

File tree

5 files changed

+40
-40
lines changed

5 files changed

+40
-40
lines changed

ext/zend_test/php_test.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
5252
HashTable global_weakmap;
5353
int replace_zend_execute_ex;
5454
int register_passes;
55+
int observe_opline_in_zendmm;
56+
zend_mm_heap* zend_orig_heap;
57+
zend_mm_heap* zend_test_heap;
5558
zend_test_fiber *active_fiber;
5659
ZEND_END_MODULE_GLOBALS(zend_test)
5760

ext/zend_test/test.c

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,6 @@ static ZEND_FUNCTION(zend_test_crash)
366366
php_printf("%s", invalid);
367367
}
368368

369-
zend_mm_heap* zend_test_heap;
370-
zend_mm_heap* zend_orig_heap;
371-
372369
static bool has_opline(zend_execute_data *execute_data)
373370
{
374371
return execute_data
@@ -383,44 +380,50 @@ void * zend_test_custom_malloc(size_t len)
383380
if (has_opline(EG(current_execute_data))) {
384381
assert(EG(current_execute_data)->opline->lineno != (uint32_t)-1);
385382
}
386-
return _zend_mm_alloc(zend_orig_heap, len);
383+
return _zend_mm_alloc(ZT_G(zend_orig_heap), len ZEND_FILE_LINE_EMPTY_CC ZEND_FILE_LINE_EMPTY_CC);
387384
}
388385

389386
void zend_test_custom_free(void *ptr)
390387
{
391388
if (has_opline(EG(current_execute_data))) {
392389
assert(EG(current_execute_data)->opline->lineno != (uint32_t)-1);
393390
}
394-
_zend_mm_free(zend_orig_heap, ptr);
391+
_zend_mm_free(ZT_G(zend_orig_heap), ptr ZEND_FILE_LINE_EMPTY_CC ZEND_FILE_LINE_EMPTY_CC);
395392
}
396393

397394
void * zend_test_custom_realloc(void * ptr, size_t len)
398395
{
399396
if (has_opline(EG(current_execute_data))) {
400397
assert(EG(current_execute_data)->opline->lineno != (uint32_t)-1);
401398
}
402-
return _zend_mm_realloc(zend_orig_heap, ptr, len);
399+
return _zend_mm_realloc(ZT_G(zend_orig_heap), ptr, len ZEND_FILE_LINE_EMPTY_CC ZEND_FILE_LINE_EMPTY_CC);
403400
}
404401

405-
static ZEND_FUNCTION(zend_test_observe_opline_in_zendmm)
402+
static PHP_INI_MH(OnUpdateZendTestObserveOplineInZendMM)
406403
{
407-
zend_test_heap = malloc(4096);
408-
memset(zend_test_heap, 0, 4096);
409-
zend_mm_set_custom_handlers(
410-
zend_test_heap,
411-
zend_test_custom_malloc,
412-
zend_test_custom_free,
413-
zend_test_custom_realloc
414-
);
415-
zend_orig_heap = zend_mm_get_heap();
416-
zend_mm_set_heap(zend_test_heap);
417-
}
404+
if (new_value == NULL) {
405+
return FAILURE;
406+
}
418407

419-
static ZEND_FUNCTION(zend_test_unobserve_opline_in_zendmm)
420-
{
421-
free(zend_test_heap);
422-
zend_test_heap = NULL;
423-
zend_mm_set_heap(zend_orig_heap);
408+
int int_value = zend_ini_parse_bool(new_value);
409+
410+
if (int_value == 1) {
411+
ZT_G(zend_test_heap) = malloc(4096);
412+
memset(ZT_G(zend_test_heap), 0, 4096);
413+
zend_mm_set_custom_handlers(
414+
ZT_G(zend_test_heap),
415+
zend_test_custom_malloc,
416+
zend_test_custom_free,
417+
zend_test_custom_realloc
418+
);
419+
ZT_G(zend_orig_heap) = zend_mm_get_heap();
420+
zend_mm_set_heap(ZT_G(zend_test_heap));
421+
} else if (ZT_G(zend_test_heap)) {
422+
free(ZT_G(zend_test_heap));
423+
ZT_G(zend_test_heap) = NULL;
424+
zend_mm_set_heap(ZT_G(zend_orig_heap));
425+
}
426+
return OnUpdateBool(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
424427
}
425428

426429
static ZEND_FUNCTION(zend_test_is_pcre_bundled)
@@ -617,6 +620,7 @@ static ZEND_METHOD(ZendTestChildClassWithMethodWithParameterAttribute, override)
617620
PHP_INI_BEGIN()
618621
STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals)
619622
STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals)
623+
STD_PHP_INI_BOOLEAN("zend_test.observe_opline_in_zendmm", "0", PHP_INI_ALL, OnUpdateZendTestObserveOplineInZendMM, observe_opline_in_zendmm, zend_zend_test_globals, zend_test_globals)
620624
PHP_INI_END()
621625

622626
void (*old_zend_execute_ex)(zend_execute_data *execute_data);
@@ -759,6 +763,13 @@ PHP_RSHUTDOWN_FUNCTION(zend_test)
759763
zend_weakrefs_hash_del(&ZT_G(global_weakmap), (zend_object *)(uintptr_t)objptr);
760764
} ZEND_HASH_FOREACH_END();
761765
zend_hash_destroy(&ZT_G(global_weakmap));
766+
767+
if (ZT_G(zend_test_heap)) {
768+
free(ZT_G(zend_test_heap));
769+
ZT_G(zend_test_heap) = NULL;
770+
zend_mm_set_heap(ZT_G(zend_orig_heap));
771+
}
772+
762773
return SUCCESS;
763774
}
764775

ext/zend_test/test.stub.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,6 @@ function zend_get_map_ptr_last(): int {}
122122

123123
function zend_test_crash(?string $message = null): void {}
124124

125-
function zend_test_observe_opline_in_zendmm(): void {}
126-
127-
function zend_test_unobserve_opline_in_zendmm(): void {}
128-
129125
#if defined(HAVE_LIBXML) && !defined(PHP_WIN32)
130126
function zend_test_override_libxml_global_state(): void {}
131127
#endif

ext/zend_test/test_arginfo.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: a57c9d1fc85dbea853f4cc910b9495a7a0c72eb3 */
2+
* Stub hash: ae75eda2b4b40224858d680c3fcf3d7cd2056bb6 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0)
55
ZEND_END_ARG_INFO()
@@ -86,10 +86,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_crash, 0, 0, IS_VOID,
8686
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, message, IS_STRING, 1, "null")
8787
ZEND_END_ARG_INFO()
8888

89-
#define arginfo_zend_test_observe_opline_in_zendmm arginfo_zend_test_void_return
90-
91-
#define arginfo_zend_test_unobserve_opline_in_zendmm arginfo_zend_test_void_return
92-
9389
#if defined(HAVE_LIBXML) && !defined(PHP_WIN32)
9490
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_override_libxml_global_state, 0, 0, IS_VOID, 0)
9591
ZEND_END_ARG_INFO()
@@ -159,8 +155,6 @@ static ZEND_FUNCTION(zend_get_current_func_name);
159155
static ZEND_FUNCTION(zend_call_method);
160156
static ZEND_FUNCTION(zend_get_map_ptr_last);
161157
static ZEND_FUNCTION(zend_test_crash);
162-
static ZEND_FUNCTION(zend_test_observe_opline_in_zendmm);
163-
static ZEND_FUNCTION(zend_test_unobserve_opline_in_zendmm);
164158
#if defined(HAVE_LIBXML) && !defined(PHP_WIN32)
165159
static ZEND_FUNCTION(zend_test_override_libxml_global_state);
166160
#endif
@@ -205,8 +199,6 @@ static const zend_function_entry ext_functions[] = {
205199
ZEND_FE(zend_call_method, arginfo_zend_call_method)
206200
ZEND_FE(zend_get_map_ptr_last, arginfo_zend_get_map_ptr_last)
207201
ZEND_FE(zend_test_crash, arginfo_zend_test_crash)
208-
ZEND_FE(zend_test_observe_opline_in_zendmm, arginfo_zend_test_observe_opline_in_zendmm)
209-
ZEND_FE(zend_test_unobserve_opline_in_zendmm, arginfo_zend_test_unobserve_opline_in_zendmm)
210202
#if defined(HAVE_LIBXML) && !defined(PHP_WIN32)
211203
ZEND_FE(zend_test_override_libxml_global_state, arginfo_zend_test_override_libxml_global_state)
212204
#endif

ext/zend_test/tests/opline_dangling.phpt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ possible segfault in `ZEND_BIND_STATIC`
44
https://github.com/php/php-src/pull/12758
55
--EXTENSIONS--
66
zend_test
7+
--INI--
8+
zend_test.observe_opline_in_zendmm=1
79
--FILE--
810
<?php
911

@@ -17,14 +19,10 @@ class Foo {
1719
public static string $s = "x";
1820
}
1921

20-
zend_test_observe_opline_in_zendmm();
21-
2222
var_dump(Foo::$i = "1");
2323
var_dump(Foo::$s, Foo::$i);
2424
var_dump(ref());
2525

26-
zend_test_unobserve_opline_in_zendmm();
27-
2826
echo 'Done.';
2927
?>
3028
--EXPECT--

0 commit comments

Comments
 (0)