]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Allow to reinit URLs library
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 16 Jun 2018 14:04:41 +0000 (15:04 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 16 Jun 2018 14:04:41 +0000 (15:04 +0100)
src/libserver/cfg_utils.c
src/libserver/url.c
src/libserver/url.h

index 6083d655fbff0dd86ebe8e5f34546db3c1052994..284a4067225874c3f70fd60424a9a5b1a2d6faf3 100644 (file)
@@ -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);
index 650f86a28dd863ebbd03536b20d63090ef407961..019a4ff3622ff99f43c76dd8d68555c506106940 100644 (file)
@@ -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 {                                                \
index 0eac9806037df714133e3beec2d8acd0cd28c2f1..b0cc102394d903b596ce27f0b15aa338c9e11bf6 100644 (file)
@@ -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