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') 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