]> source.dussan.org Git - rspamd.git/commitdiff
[CritFix] Fix memory leak in maps scheduling
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 7 May 2017 13:47:41 +0000 (14:47 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 7 May 2017 13:47:41 +0000 (14:47 +0100)
src/libutil/map.c
src/libutil/map_private.h

index 30617689c5b27d79b73a883f4203a0e32b220271..c6a7189a8782dbc6e73a88dceb03407084237375 100644 (file)
@@ -800,6 +800,7 @@ rspamd_map_periodic_dtor (struct map_periodic_cbdata *periodic)
 
        map = periodic->map;
        msg_debug_map ("periodic dtor %p", periodic);
+       event_del (&periodic->ev);
 
        if (periodic->need_modify) {
                /* We are done */
@@ -853,20 +854,20 @@ rspamd_map_schedule_periodic (struct rspamd_map *map,
        REF_INIT_RETAIN (cbd, rspamd_map_periodic_dtor);
 
        if (initial) {
-               evtimer_set (&map->ev, rspamd_map_periodic_callback, cbd);
-               event_base_set (map->ev_base, &map->ev);
+               evtimer_set (&cbd->ev, rspamd_map_periodic_callback, cbd);
+               event_base_set (map->ev_base, &cbd->ev);
        }
        else {
-               evtimer_del (&map->ev);
-               evtimer_set (&map->ev, rspamd_map_periodic_callback, cbd);
-               event_base_set (map->ev_base, &map->ev);
+               evtimer_set (&cbd->ev, rspamd_map_periodic_callback, cbd);
+               event_base_set (map->ev_base, &cbd->ev);
        }
 
        jittered_sec = rspamd_time_jitter (timeout, 0);
-       msg_debug_map ("schedule new periodic event %p in %.2f seconds", cbd, jittered_sec);
+       msg_debug_map ("schedule new periodic event %p in %.2f seconds",
+                       cbd, jittered_sec);
        double_to_tv (jittered_sec, &map->tv);
 
-       evtimer_add (&map->ev, &map->tv);
+       evtimer_add (&cbd->ev, &map->tv);
 }
 
 static void
index f59b3b6c1f75d3b59631bcbe1b1ff647e405461f..abb4ef613337477a33fe3e9bd72d6577895466ad 100644 (file)
@@ -81,7 +81,6 @@ struct rspamd_map {
        gchar *description;
        gchar *name;
        guint32 id;
-       struct event ev;
        struct timeval tv;
        gdouble poll_timeout;
        /* Shared lock for temporary disabling of map reading (e.g. when this map is written by UI) */
@@ -131,6 +130,7 @@ enum rspamd_map_http_stage {
 struct map_periodic_cbdata {
        struct rspamd_map *map;
        struct map_cb_data cbdata;
+       struct event ev;
        gboolean need_modify;
        gboolean errored;
        guint cur_backend;