From 4b5afd0148cef6c845a37aff68e1fbac8f5653d7 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Thu, 6 Jan 2022 21:22:50 +0100 Subject: prevent double checks and fixed segfault on return value access --- src/sp_disabled_functions.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/sp_disabled_functions.c') diff --git a/src/sp_disabled_functions.c b/src/sp_disabled_functions.c index 1d9c6c7..c0c642b 100644 --- a/src/sp_disabled_functions.c +++ b/src/sp_disabled_functions.c @@ -400,7 +400,6 @@ static void should_drop_on_ret(const zval* return_value, bool match_type = false, match_value = false; while (config) { - const zend_string* ret_value_str = NULL; sp_disabled_function const* const config_node = (sp_disabled_function*)(config->data); @@ -444,13 +443,18 @@ static void should_drop_on_ret(const zval* return_value, } } - ret_value_str = sp_zval_to_zend_string(return_value); + const zend_string* ret_value_str = NULL; + sp_php_type ret_type = SP_PHP_TYPE_NULL; + + if (return_value) { + ret_value_str = sp_zval_to_zend_string(return_value); + ret_type = Z_TYPE_P(return_value); + } match_type = (config_node->ret_type) && - (config_node->ret_type == Z_TYPE_P(return_value)); - match_value = (config_node->ret || config_node->r_ret) && - (true == sp_match_value(ret_value_str, config_node->ret, - config_node->r_ret)); + (config_node->ret_type == ret_type); + match_value = return_value && (config_node->ret || config_node->r_ret) && + (true == sp_match_value(ret_value_str, config_node->ret, config_node->r_ret)); if (true == match_type || true == match_value) { if (true == config_node->allow) { -- cgit v1.3