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 committed by Gina Peter Banyard
parent e4df0cbe1c
commit 8cb15f6203
3 changed files with 31 additions and 7 deletions

View file

@ -90,11 +90,6 @@ static void php_phpdbg_destroy_bp_condition(zval *data) /* {{{ */
efree(brake); efree(brake);
} /* }}} */ } /* }}} */
static void php_phpdbg_destroy_registered(zval *data) /* {{{ */
{
zend_function_dtor(data);
} /* }}} */
static void php_phpdbg_destroy_file_source(zval *data) /* {{{ */ static void php_phpdbg_destroy_file_source(zval *data) /* {{{ */
{ {
phpdbg_file_source *source = (phpdbg_file_source *) Z_PTR_P(data); phpdbg_file_source *source = (phpdbg_file_source *) Z_PTR_P(data);
@ -164,7 +159,7 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */
zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], 8, NULL, NULL, 0); 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(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); zend_hash_init(&PHPDBG_G(file_sources), 0, NULL, php_phpdbg_destroy_file_source, 0);
phpdbg_setup_watchpoints(); phpdbg_setup_watchpoints();

View file

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