]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix crashes on task cleanup
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 10 Sep 2018 13:54:08 +0000 (14:54 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 10 Sep 2018 13:54:23 +0000 (14:54 +0100)
src/libserver/dns.c
src/libserver/events.c
src/libserver/events.h
src/libstat/backends/redis_backend.c
src/libstat/learn_cache/redis_cache.c
src/lua/lua_http.c
src/lua/lua_redis.c
src/lua/lua_tcp.c
src/plugins/fuzzy_check.c
src/plugins/surbl.c

index fbf37363ae0299cd52abeb3a7950f90fa3d4fffc..5ac215ff725eef9b7a53bec821b82fa5eb2b2202 100644 (file)
@@ -122,7 +122,7 @@ make_dns_request (struct rspamd_dns_resolver *resolver,
                return FALSE;
        }
 
-       if (session && rspamd_session_is_destroying (session)) {
+       if (session && rspamd_session_blocked (session)) {
                return FALSE;
        }
 
index c23c903285d1adf3be072ec9a2b3a1072c043040..a15338e7a7345a0aa914a8834dad57e4b423fd57 100644 (file)
 
 #define RSPAMD_SESSION_FLAG_WATCHING (1 << 0)
 #define RSPAMD_SESSION_FLAG_DESTROYING (1 << 1)
+#define RSPAMD_SESSION_FLAG_CLEANUP (1 << 2)
 
 #define RSPAMD_SESSION_IS_WATCHING(s) ((s)->flags & RSPAMD_SESSION_FLAG_WATCHING)
-#define RSPAMD_SESSION_IS_DESTROYING(s) ((s)->flags & RSPAMD_SESSION_FLAG_DESTROYING)
+#define RSPAMD_SESSION_CAN_ADD_EVENT(s) (!((s)->flags & (RSPAMD_SESSION_FLAG_DESTROYING|RSPAMD_SESSION_FLAG_CLEANUP)))
 
 #define msg_err_session(...) rspamd_default_log_function(G_LOG_LEVEL_CRITICAL, \
         "events", session->pool->tag.uid, \
@@ -172,8 +173,9 @@ rspamd_session_add_event (struct rspamd_async_session *session,
                g_assert_not_reached ();
        }
 
-       if (RSPAMD_SESSION_IS_DESTROYING (session)) {
-               msg_debug_session ("skip adding event subsystem: %s: session is destroying",
+       if (!RSPAMD_SESSION_CAN_ADD_EVENT (session)) {
+               msg_debug_session ("skip adding event subsystem: %s: "
+                                        "session is destroying/cleaning",
                                g_quark_to_string (subsystem));
 
                return NULL;
@@ -293,7 +295,7 @@ rspamd_session_destroy (struct rspamd_async_session *session)
                return FALSE;
        }
 
-       if (!(session->flags & RSPAMD_SESSION_FLAG_DESTROYING)) {
+       if (!rspamd_session_blocked (session)) {
                session->flags |= RSPAMD_SESSION_FLAG_DESTROYING;
                rspamd_session_cleanup (session);
 
@@ -315,6 +317,8 @@ rspamd_session_cleanup (struct rspamd_async_session *session)
                return;
        }
 
+       session->flags |= RSPAMD_SESSION_FLAG_CLEANUP;
+
        kh_foreach_key (session->events, ev, {
                /* Call event's finalizer */
                msg_debug_session ("removed event on destroy: %p, subsystem: %s",
@@ -327,6 +331,8 @@ rspamd_session_cleanup (struct rspamd_async_session *session)
        });
 
        kh_clear (rspamd_events_hash, session->events);
+
+       session->flags &= ~RSPAMD_SESSION_FLAG_CLEANUP;
 }
 
 gboolean
@@ -509,9 +515,9 @@ rspamd_session_mempool (struct rspamd_async_session *session)
 }
 
 gboolean
-rspamd_session_is_destroying (struct rspamd_async_session *session)
+rspamd_session_blocked (struct rspamd_async_session *session)
 {
        g_assert (session != NULL);
 
-       return RSPAMD_SESSION_IS_DESTROYING (session);
+       return !RSPAMD_SESSION_CAN_ADD_EVENT (session);
 }
\ No newline at end of file
index 10ccb8d1d82f12888680f9c27e3e780295e9c0ab..f7eeae9d0049532bf774008d8a2a05f47b2659ab 100644 (file)
@@ -153,6 +153,6 @@ struct rspamd_async_watcher* rspamd_session_get_watcher (
  * @param s
  * @return
  */
-gboolean rspamd_session_is_destroying (struct rspamd_async_session *s);
+gboolean rspamd_session_blocked (struct rspamd_async_session *s);
 
 #endif /* RSPAMD_EVENTS_H */
index 5510cff05940c7cac8e15adf386d39d002b41a8d..7b49db59e3e726acd023c5bc26741988d5b25122 100644 (file)
@@ -1572,7 +1572,7 @@ rspamd_redis_process_tokens (struct rspamd_task *task,
        gint ret;
        const gchar *learned_key = "learns";
 
-       if (rspamd_session_is_destroying (task->s)) {
+       if (rspamd_session_blocked (task->s)) {
                return FALSE;
        }
 
@@ -1667,7 +1667,7 @@ rspamd_redis_learn_tokens (struct rspamd_task *task, GPtrArray *tokens,
        goffset off;
        const gchar *learned_key = "learns";
 
-       if (rspamd_session_is_destroying (task->s)) {
+       if (rspamd_session_blocked (task->s)) {
                return FALSE;
        }
 
index e17f20d27b46f8de0ff937c9b7c24ef3cb70c5ef..fc928e75eae8ae62e58dee1411c13938e4bb1985 100644 (file)
@@ -438,7 +438,7 @@ rspamd_stat_cache_redis_check (struct rspamd_task *task,
        struct timeval tv;
        gchar *h;
 
-       if (rspamd_session_is_destroying (task->s)) {
+       if (rspamd_session_blocked (task->s)) {
                return RSPAMD_LEARN_INGORE;
        }
 
@@ -473,7 +473,7 @@ rspamd_stat_cache_redis_learn (struct rspamd_task *task,
        gchar *h;
        gint flag;
 
-       if (rspamd_session_is_destroying (task->s)) {
+       if (rspamd_session_blocked (task->s)) {
                return RSPAMD_LEARN_INGORE;
        }
 
index 1534ebfa203cd225ad13aa857d5632a4a6e7dd66..2eb49d281fd700cb388d36a34f060652b1ad9855 100644 (file)
@@ -809,7 +809,7 @@ lua_http_request (lua_State *L)
                return 1;
        }
 
-       if (session && rspamd_session_is_destroying (session)) {
+       if (session && rspamd_session_blocked (session)) {
                lua_pushboolean (L, FALSE);
 
                return 1;
index 0fc9c43b7e4f3266bae57a2dea0fb3233b8bf886..4003ac36ae74f11b128c8e350fbd9d55b396948c 100644 (file)
@@ -686,7 +686,7 @@ rspamd_lua_redis_prepare_connection (lua_State *L, gint *pcbref)
 
                lua_pop (L, 1); /* table */
 
-               if (session && rspamd_session_is_destroying (session)) {
+               if (session && rspamd_session_blocked (session)) {
                        ret = FALSE;
                }
 
@@ -1215,7 +1215,7 @@ lua_redis_add_cmd (lua_State *L)
 
                        LL_PREPEND (sp_ud->c->specific, sp_ud);
 
-                       if (ud->s && rspamd_session_is_destroying (ud->s)) {
+                       if (ud->s && rspamd_session_blocked (ud->s)) {
                                lua_pushboolean (L, 0);
                                lua_pushstring (L, "session is terminating");
 
index 3bd1ffad21623b3fee1648780d1c4056e2b10260..85f2941424afb1039fc9fc561e23afd344fe3f85 100644 (file)
@@ -1573,7 +1573,7 @@ lua_tcp_request (lua_State *L)
        if (session) {
                cbd->session = session;
 
-               if (rspamd_session_is_destroying (session)) {
+               if (rspamd_session_blocked (session)) {
                        TCP_RELEASE (cbd);
                        lua_pushboolean (L, FALSE);
 
@@ -1737,7 +1737,7 @@ lua_tcp_connect_sync (lua_State *L)
        if (session) {
                cbd->session = session;
 
-               if (rspamd_session_is_destroying (session)) {
+               if (rspamd_session_blocked (session)) {
                        TCP_RELEASE (cbd);
                        lua_pushboolean (L, FALSE);
                        lua_pushliteral (L, "Session is being destroyed, requests are not allowed");
index bf08c0e46a8dc8661fc1a4ab83c400d55dd38374..61ff8f54e4e791d3e623bcfeb2cc17b51709eee4 100644 (file)
@@ -2830,7 +2830,7 @@ register_fuzzy_client_call (struct rspamd_task *task,
        rspamd_inet_addr_t *addr;
        gint sock;
 
-       if (!rspamd_session_is_destroying (task->s)) {
+       if (!rspamd_session_blocked (task->s)) {
                /* Get upstream */
                selected = rspamd_upstream_get (rule->servers, RSPAMD_UPSTREAM_ROUND_ROBIN,
                                NULL, 0);
@@ -3311,7 +3311,7 @@ fuzzy_check_send_lua_learn (struct fuzzy_rule *rule,
        gint ret = -1;
 
        /* Get upstream */
-       if (!rspamd_session_is_destroying (task->s)) {
+       if (!rspamd_session_blocked (task->s)) {
                while ((selected = rspamd_upstream_get (rule->servers,
                                RSPAMD_UPSTREAM_SEQUENTIAL, NULL, 0))) {
                        /* Create UDP socket */
index 5b2375888e6653c9780a5bbdecb091130072a744..31c873304fb8092a0b7a0e396d015844487736e4 100644 (file)
@@ -1638,7 +1638,7 @@ register_redirector_call (struct rspamd_url *url, struct rspamd_task *task,
        struct rspamd_http_message *msg;
        struct surbl_ctx *surbl_module_ctx = surbl_get_context (task->cfg);
 
-       if (!rspamd_session_is_destroying (task->s)) {
+       if (!rspamd_session_blocked (task->s)) {
 
                selected = rspamd_upstream_get (surbl_module_ctx->redirectors,
                                RSPAMD_UPSTREAM_ROUND_ROBIN, url->host, url->hostlen);