From a6c6934433979796a6c490899e9d21acf6b50571 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Thu, 31 Dec 2020 16:36:18 +0100 Subject: Enabled matching on local var in php8 PHP8 failed hard when it couldn't find the local variable we're looking for. using ZEND_FETCH_CLASS_SILENT makes it silent. --- src/sp_var_value.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/sp_var_value.c') diff --git a/src/sp_var_value.c b/src/sp_var_value.c index 7f08c46..8109377 100644 --- a/src/sp_var_value.c +++ b/src/sp_var_value.c @@ -50,7 +50,7 @@ static zval *get_local_var(zend_execute_data *ed, const char *var_name) { static zval *get_constant(const char *value) { zend_string *name = zend_string_init(value, strlen(value), 0); - zval *zvalue = zend_get_constant_ex(name, NULL, 0); + zval *zvalue = zend_get_constant_ex(name, NULL, ZEND_FETCH_CLASS_SILENT); zend_string_release(name); return zvalue; -- cgit v1.3 From 1e8e75b554955cc59866a41bb32853a96e8e83ae Mon Sep 17 00:00:00 2001 From: Sylvain "caillou" Lefevre Date: Sun, 3 Jan 2021 20:40:37 +0100 Subject: Don't fallback to local variables when unable to get function parameter --- src/sp_var_value.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'src/sp_var_value.c') diff --git a/src/sp_var_value.c b/src/sp_var_value.c index 8109377..986ea2d 100644 --- a/src/sp_var_value.c +++ b/src/sp_var_value.c @@ -51,7 +51,6 @@ static zval *get_local_var(zend_execute_data *ed, const char *var_name) { static zval *get_constant(const char *value) { zend_string *name = zend_string_init(value, strlen(value), 0); zval *zvalue = zend_get_constant_ex(name, NULL, ZEND_FETCH_CLASS_SILENT); - zend_string_release(name); return zvalue; } @@ -69,14 +68,10 @@ static zval *get_var_value(zend_execute_data *ed, const char *var_name, } if (is_param) { - zval *zvalue = get_param_var(ed, var_name); - if (!zvalue) { - return get_local_var(ed, var_name); - } - return zvalue; + return get_param_var(ed, var_name); + } else { + return get_local_var(ed, var_name); } - - return get_local_var(ed, var_name); } static void *get_entry_hashtable(const HashTable *ht, const char *entry, -- cgit v1.3 From f4e3a800aa5a243464911fc2e9fa81a7848c57f7 Mon Sep 17 00:00:00 2001 From: xXx-caillou-xXx Date: Sun, 3 Jan 2021 00:11:09 +0100 Subject: Add a check on parameters names Snuffleupagus will now warn when a particular function doesn't have the expected parameters configuration-wise. --- src/sp_pcre_compat.c | 6 ++---- src/sp_var_value.c | 13 ++++++++++++- .../broken_conf_config_invalid_param.phpt | 16 ++++++++++++++++ .../config/broken_conf_config_invalid_param.ini | 1 + .../config/config_disabled_functions_param_array.ini | 1 - 5 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 src/tests/broken_configuration/broken_conf_config_invalid_param.phpt create mode 100644 src/tests/broken_configuration/config/broken_conf_config_invalid_param.ini (limited to 'src/sp_var_value.c') diff --git a/src/sp_pcre_compat.c b/src/sp_pcre_compat.c index 283eeb7..509a8ea 100644 --- a/src/sp_pcre_compat.c +++ b/src/sp_pcre_compat.c @@ -14,8 +14,7 @@ sp_pcre* sp_pcre_compile(const char* const pattern) { #else const char* pcre_error = NULL; int erroroffset; - ret = - pcre_compile(pattern, PCRE_CASELESS, &pcre_error, &erroroffset, NULL); + ret = pcre_compile(pattern, PCRE_CASELESS, &pcre_error, &erroroffset, NULL); #endif if (NULL == ret) { @@ -38,8 +37,7 @@ bool ZEND_HOT sp_is_regexp_matching_len(const sp_pcre* regexp, const char* str, ret = pcre2_match(regexp, (PCRE2_SPTR)str, len, 0, 0, match_data, NULL); #else int vec[30]; - ret = pcre_exec(regexp, NULL, str, len, 0, 0, vec, - sizeof(vec) / sizeof(int)); + ret = pcre_exec(regexp, NULL, str, len, 0, 0, vec, sizeof(vec) / sizeof(int)); #endif if (ret < 0) { diff --git a/src/sp_var_value.c b/src/sp_var_value.c index 986ea2d..126ba0e 100644 --- a/src/sp_var_value.c +++ b/src/sp_var_value.c @@ -68,7 +68,18 @@ static zval *get_var_value(zend_execute_data *ed, const char *var_name, } if (is_param) { - return get_param_var(ed, var_name); + zval *zvalue = get_param_var(ed, var_name); + if (!zvalue) { + const char *complete_function_path = get_complete_function_path(ed); + sp_log_warn("config", + "It seems that you are filtering on a parameter " + "'%s' of the function '%s', but the parameter does " + "not exists.", + var_name, complete_function_path); + efree(complete_function_path); + return NULL; + } + return zvalue; } else { return get_local_var(ed, var_name); } diff --git a/src/tests/broken_configuration/broken_conf_config_invalid_param.phpt b/src/tests/broken_configuration/broken_conf_config_invalid_param.phpt new file mode 100644 index 0000000..ac85dea --- /dev/null +++ b/src/tests/broken_configuration/broken_conf_config_invalid_param.phpt @@ -0,0 +1,16 @@ +--TEST-- +Broken configuration with invalid parameter warning +--SKIPIF-- + +--INI-- +sp.configuration_file={PWD}/config/broken_conf_config_invalid_param.ini +--FILE-- +