From 916a9d755a1660e086ef66d7113c2bcfc808a557 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 8 May 2021 16:14:49 +0200 Subject: Handle a possible issue with regexp Gracefully handle the case where we can't get allocated memory when trying to match a regex. --- src/sp_pcre_compat.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/sp_pcre_compat.c') diff --git a/src/sp_pcre_compat.c b/src/sp_pcre_compat.c index 509a8ea..0d19769 100644 --- a/src/sp_pcre_compat.c +++ b/src/sp_pcre_compat.c @@ -34,6 +34,9 @@ bool ZEND_HOT sp_is_regexp_matching_len(const sp_pcre* regexp, const char* str, #ifdef SP_HAS_PCRE2 pcre2_match_data* match_data = pcre2_match_data_create_from_pattern(regexp, NULL); + if (NULL == match_data) { + sp_log_err("regexp", "Unable to get memory for a regxp."); + } ret = pcre2_match(regexp, (PCRE2_SPTR)str, len, 0, 0, match_data, NULL); #else int vec[30]; -- cgit v1.3 From db14b8549e7bb9c132435f845a16f8d33677e865 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 8 May 2021 16:28:14 +0200 Subject: Fix a memory leak when using pcre2 --- src/sp_pcre_compat.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/sp_pcre_compat.c') diff --git a/src/sp_pcre_compat.c b/src/sp_pcre_compat.c index 0d19769..09a2fc7 100644 --- a/src/sp_pcre_compat.c +++ b/src/sp_pcre_compat.c @@ -38,6 +38,7 @@ bool ZEND_HOT sp_is_regexp_matching_len(const sp_pcre* regexp, const char* str, sp_log_err("regexp", "Unable to get memory for a regxp."); } ret = pcre2_match(regexp, (PCRE2_SPTR)str, len, 0, 0, match_data, NULL); + pcre2_match_data_free(match_data); #else int vec[30]; ret = pcre_exec(regexp, NULL, str, len, 0, 0, vec, sizeof(vec) / sizeof(int)); -- cgit v1.3 From 194b0bc9f0a4699854ea314ffa23e59f8082ddae Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 8 May 2021 17:14:46 +0200 Subject: Remove some memory-leaks --- src/snuffleupagus.c | 5 ++++- src/sp_config.c | 23 ++++++++++++++++++++++- src/sp_config.h | 1 + src/sp_pcre_compat.c | 5 +++++ src/sp_pcre_compat.h | 1 + 5 files changed, 33 insertions(+), 2 deletions(-) (limited to 'src/sp_pcre_compat.c') diff --git a/src/snuffleupagus.c b/src/snuffleupagus.c index f192dd2..79a3003 100644 --- a/src/snuffleupagus.c +++ b/src/snuffleupagus.c @@ -154,8 +154,11 @@ PHP_MSHUTDOWN_FUNCTION(snuffleupagus) { FREE_LST_DISABLE(config_disabled_functions_reg_ret->disabled_functions); #undef FREE_LST_DISABLE + sp_list_node *_n = SNUFFLEUPAGUS_G(config).config_cookie->cookies; + sp_cookie_list_free(_n); + sp_list_free(_n); + #define FREE_LST(L) sp_list_free(SNUFFLEUPAGUS_G(config).L); - FREE_LST(config_cookie->cookies); FREE_LST(config_eval->blacklist); FREE_LST(config_eval->whitelist); FREE_LST(config_wrapper->whitelist); diff --git a/src/sp_config.c b/src/sp_config.c index 69730e3..958c7e5 100644 --- a/src/sp_config.c +++ b/src/sp_config.c @@ -216,11 +216,32 @@ void sp_disabled_function_list_free(sp_list_node *list) { sp_list_node *cursor = list; while (cursor) { sp_disabled_function *df = cursor->data; - if (df && df->functions_list) sp_list_free(df->functions_list); if (df) { + sp_list_free(df->functions_list); + sp_list_free(df->param_array_keys); + sp_list_free(df->var_array_keys); + + sp_pcre_free(df->r_filename); + sp_pcre_free(df->r_function); + sp_pcre_free(df->r_param); + sp_pcre_free(df->r_ret); + sp_pcre_free(df->r_value); + sp_pcre_free(df->r_key); + sp_tree_free(df->param); sp_tree_free(df->var); } cursor = cursor->next; } } + +void sp_cookie_list_free(sp_list_node *list) { + sp_list_node *cursor = list; + while (cursor) { + sp_cookie *c = cursor->data; + if (c) { + sp_pcre_free(c->name_r); + } + cursor = cursor->next; + } +} diff --git a/src/sp_config.h b/src/sp_config.h index b06e8be..e7b1473 100644 --- a/src/sp_config.h +++ b/src/sp_config.h @@ -282,5 +282,6 @@ int parse_list(char *restrict, char *restrict, void *); // cleanup void sp_disabled_function_list_free(sp_list_node *); +void sp_cookie_list_free(sp_list_node *); #endif /* SP_CONFIG_H */ diff --git a/src/sp_pcre_compat.c b/src/sp_pcre_compat.c index 09a2fc7..adcdee7 100644 --- a/src/sp_pcre_compat.c +++ b/src/sp_pcre_compat.c @@ -1,5 +1,10 @@ #include "php_snuffleupagus.h" +inline void sp_pcre_free(sp_pcre* regexp) { + pcre2_code_free(regexp); + regexp = NULL; +} + sp_pcre* sp_pcre_compile(const char* const pattern) { assert(NULL != pattern); diff --git a/src/sp_pcre_compat.h b/src/sp_pcre_compat.h index 14c33b2..725004d 100644 --- a/src/sp_pcre_compat.h +++ b/src/sp_pcre_compat.h @@ -17,6 +17,7 @@ #endif sp_pcre* sp_pcre_compile(const char* str); +void sp_pcre_free(sp_pcre* regexp); #define sp_is_regexp_matching_zend(regexp, zstr) \ sp_is_regexp_matching_len(regexp, ZSTR_VAL(zstr), ZSTR_LEN(zstr)) #define sp_is_regexp_matching(regexp, str) \ -- cgit v1.3 From 7ea172dd6909c624bd9db603c4e4f86e1042a7e5 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sun, 9 May 2021 18:09:17 +0200 Subject: Fix compilation on non-pcre2 targets --- src/sp_pcre_compat.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/sp_pcre_compat.c') diff --git a/src/sp_pcre_compat.c b/src/sp_pcre_compat.c index adcdee7..3bd00ca 100644 --- a/src/sp_pcre_compat.c +++ b/src/sp_pcre_compat.c @@ -1,7 +1,9 @@ #include "php_snuffleupagus.h" inline void sp_pcre_free(sp_pcre* regexp) { +#ifdef SP_HAS_PCRE2 pcre2_code_free(regexp); +#endif regexp = NULL; } -- cgit v1.3