]> 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 14:04:21 +0000 (15:04 +0100)
src/libutil/map.c
src/libutil/map_private.h

index 97a982797267aee727b325ebc0eed7dfdc9e681f..e67e0f6fbd1762da9529c6eefc484b5a13d3af88 100644 (file)
@@ -717,6 +717,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 */
@@ -770,20 +771,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 9e24695b53d30d394a8d13cca628083dabdbf2a7..4f00c3db2b4dd7b448c68750ec4327a9d536a332 100644 (file)
@@ -79,7 +79,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) */
@@ -123,6 +122,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;