Fix crashes in function registration + test

Internal function won't need their refcount increased as they outlive
the debugger session, and userland functions won't be unloaded either.
So no refcount management is necessary for registered functions.
This commit is contained in:
Niels Dossche 2025-01-06 19:28:21 +01:00
parent 47683487f8
commit 1235c74828
No known key found for this signature in database
GPG key ID: B8A8AD166DF0E2E5
4 changed files with 34 additions and 7 deletions

3
NEWS
View file

@ -16,6 +16,9 @@ PHP NEWS
- Intl:
. Fixed bug GH-11874 (intl causing segfault in docker images). (nielsdos)
- PHPDBG:
. Fix crashes in function registration + test. (nielsdos, Girgias)
- SNMP:
. Fixed bug GH-17330 (SNMP::setSecurity segfault on closed session).
(David Carlier)

View file

@ -89,11 +89,6 @@ static void php_phpdbg_destroy_bp_condition(zval *data) /* {{{ */
efree(brake);
} /* }}} */
static void php_phpdbg_destroy_registered(zval *data) /* {{{ */
{
zend_function_dtor(data);
} /* }}} */
static void php_phpdbg_destroy_file_source(zval *data) /* {{{ */
{
phpdbg_file_source *source = (phpdbg_file_source *) Z_PTR_P(data);
@ -163,7 +158,7 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */
zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], 8, NULL, NULL, 0);
zend_hash_init(&PHPDBG_G(seek), 8, NULL, NULL, 0);
zend_hash_init(&PHPDBG_G(registered), 8, NULL, php_phpdbg_destroy_registered, 0);
zend_hash_init(&PHPDBG_G(registered), 8, NULL, NULL, true);
zend_hash_init(&PHPDBG_G(file_sources), 0, NULL, php_phpdbg_destroy_file_source, 0);
phpdbg_setup_watchpoints();

View file

@ -1424,7 +1424,6 @@ PHPDBG_COMMAND(register) /* {{{ */
if (!zend_hash_str_exists(&PHPDBG_G(registered), lcname, lcname_len)) {
if ((function = zend_hash_str_find_ptr(EG(function_table), lcname, lcname_len))) {
zend_hash_str_update_ptr(&PHPDBG_G(registered), lcname, lcname_len, function);
function_add_ref(function);
phpdbg_notice("Registered %s", lcname);
} else {

View file

@ -0,0 +1,30 @@
--TEST--
Test registering of functions
--PHPDBG--
R testfunc
testfunc 1 2 3
R var_dump
var_dump foo
q
--FILE--
<?php
function testfunc() {
var_dump(func_get_args());
}
?>
--EXPECTF--
[Successful compilation of %s]
prompt> [Registered testfunc]
prompt> array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
prompt> [Registered var_dump]
prompt> string(3) "foo"
prompt>