From b9902dde2b8241cc52cb59e9ea99374cad6c071c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 16 Jun 2018 15:04:41 +0100 Subject: [PATCH] [Minor] Allow to reinit URLs library --- src/libserver/cfg_utils.c | 8 +++++ src/libserver/url.c | 66 ++++++++++++++++++++++++--------------- src/libserver/url.h | 2 +- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index 6083d655f..284a40672 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -653,6 +653,11 @@ rspamd_config_parse_log_format (struct rspamd_config *cfg) return TRUE; } +static void +rspamd_urls_config_dtor (gpointer _unused) +{ + rspamd_url_deinit (); +} /* * Perform post load actions @@ -751,6 +756,9 @@ rspamd_config_post_load (struct rspamd_config *cfg, else { rspamd_url_init (cfg->tld_file); } + + rspamd_mempool_add_destructor (cfg->cfg_pool, rspamd_urls_config_dtor, + NULL); } init_dynamic_config (cfg); diff --git a/src/libserver/url.c b/src/libserver/url.c index 650f86a28..019a4ff36 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -474,43 +474,57 @@ rspamd_url_add_static_matchers (struct url_match_scanner *sc) g_array_append_vals (sc->matchers, static_matchers, n); } +void +rspamd_url_deinit (void) +{ + if (url_scanner != NULL) { + rspamd_multipattern_destroy (url_scanner->search_trie); + g_array_free (url_scanner->matchers, TRUE); + g_free (url_scanner); + + url_scanner = NULL; + } +} + void rspamd_url_init (const gchar *tld_file) { GError *err = NULL; - if (url_scanner == NULL) { - url_scanner = g_malloc (sizeof (struct url_match_scanner)); + if (url_scanner != NULL) { + rspamd_url_deinit (); + } - if (tld_file) { - /* Reserve larger multipattern */ - url_scanner->matchers = g_array_sized_new (FALSE, TRUE, - sizeof (struct url_matcher), 13000); - url_scanner->search_trie = rspamd_multipattern_create_sized (13000, - RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE); - } - else { - url_scanner->matchers = g_array_sized_new (FALSE, TRUE, - sizeof (struct url_matcher), 128); - url_scanner->search_trie = rspamd_multipattern_create_sized (128, - RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE); - } + url_scanner = g_malloc (sizeof (struct url_match_scanner)); - rspamd_url_add_static_matchers (url_scanner); + if (tld_file) { + /* Reserve larger multipattern */ + url_scanner->matchers = g_array_sized_new (FALSE, TRUE, + sizeof (struct url_matcher), 13000); + url_scanner->search_trie = rspamd_multipattern_create_sized (13000, + RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE); + } + else { + url_scanner->matchers = g_array_sized_new (FALSE, TRUE, + sizeof (struct url_matcher), 128); + url_scanner->search_trie = rspamd_multipattern_create_sized (128, + RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE); + } - if (tld_file != NULL) { - rspamd_url_parse_tld_file (tld_file, url_scanner); - } + rspamd_url_add_static_matchers (url_scanner); - if (!rspamd_multipattern_compile (url_scanner->search_trie, &err)) { - msg_err ("cannot compile tld patterns, url matching will be " - "broken completely: %e", err); - g_error_free (err); - } + if (tld_file != NULL) { + rspamd_url_parse_tld_file (tld_file, url_scanner); + } - msg_debug ("initialized trie of %ud elements", - url_scanner->matchers->len); + if (!rspamd_multipattern_compile (url_scanner->search_trie, &err)) { + msg_err ("cannot compile tld patterns, url matching will be " + "broken completely: %e", err); + g_error_free (err); } + + msg_debug ("initialized trie of %ud elements", + url_scanner->matchers->len); } #define SET_U(u, field) do { \ diff --git a/src/libserver/url.h b/src/libserver/url.h index 0eac98060..b0cc10239 100644 --- a/src/libserver/url.h +++ b/src/libserver/url.h @@ -91,7 +91,7 @@ enum rspamd_url_protocol { * @param cfg */ void rspamd_url_init (const gchar *tld_file); - +void rspamd_url_deinit (void); /* * Parse urls inside text * @param pool memory pool -- 2.39.5