]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Fix race condition in slow timer
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 17 Jan 2020 13:10:58 +0000 (13:10 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 17 Jan 2020 13:10:58 +0000 (13:10 +0000)
src/libserver/rspamd_symcache.c

index 7a9e89c421a7c6c78083d391481e2377de0ac428..597df113da6e41e1f64ed5151581345764a2bf19 100644 (file)
@@ -3032,6 +3032,20 @@ struct rspamd_symcache_delayed_cbdata {
        struct ev_timer tm;
 };
 
+static void
+rspamd_symcache_delayed_item_fin (gpointer ud)
+{
+       struct rspamd_symcache_delayed_cbdata *cbd =
+                       (struct rspamd_symcache_delayed_cbdata *)ud;
+       struct rspamd_task *task;
+       struct cache_savepoint *checkpoint;
+
+       task = cbd->task;
+       checkpoint = task->checkpoint;
+       checkpoint->has_slow = FALSE;
+       ev_timer_stop (task->event_loop, &cbd->tm);
+}
+
 static void
 rspamd_symcache_delayed_item_cb (EV_P_ ev_timer *w, int what)
 {
@@ -3047,9 +3061,11 @@ rspamd_symcache_delayed_item_cb (EV_P_ ev_timer *w, int what)
        item = cbd->item;
        task = cbd->task;
        checkpoint = task->checkpoint;
-       checkpoint->has_slow = FALSE;
        cbd->event = NULL;
-       ev_timer_stop (EV_A_ w);
+
+       /* Timer will be stopped here */
+       rspamd_session_remove_event (task->s,
+                       rspamd_symcache_delayed_item_fin, cbd);
 
        /* Process all reverse dependencies */
        PTR_ARRAY_FOREACH (item->rdeps, i, rdep) {
@@ -3074,8 +3090,6 @@ rspamd_symcache_delayed_item_cb (EV_P_ ev_timer *w, int what)
                        }
                }
        }
-
-       rspamd_session_remove_event (task->s, NULL, cbd);
 }
 
 static void
@@ -3085,9 +3099,9 @@ rspamd_delayed_timer_dtor (gpointer d)
                        (struct rspamd_symcache_delayed_cbdata *)d;
 
        if (cbd->event) {
-               ev_timer_stop (cbd->task->event_loop, &cbd->tm);
                /* Event has not been executed */
-               rspamd_session_remove_event (cbd->task->s, NULL, cbd);
+               rspamd_session_remove_event (cbd->task->s,
+                               rspamd_symcache_delayed_item_fin, cbd);
                cbd->event = NULL;
        }
 }
@@ -3163,12 +3177,13 @@ rspamd_symcache_finalize_item (struct rspamd_task *task,
        }
 
        if (enable_slow_timer) {
-               struct rspamd_symcache_delayed_cbdata *cbd = rspamd_mempool_alloc (task->task_pool,
-                               sizeof (*cbd));
+               struct rspamd_symcache_delayed_cbdata *cbd =
+                               rspamd_mempool_alloc (task->task_pool,sizeof (*cbd));
                /* Add timer to allow something else to be executed */
                ev_timer *tm = &cbd->tm;
 
-               cbd->event = rspamd_session_add_event (task->s, NULL, cbd,
+               cbd->event = rspamd_session_add_event (task->s,
+                               rspamd_symcache_delayed_item_fin, cbd,
                                "symcache");
 
                /*