]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix race condition in DNS events.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 1 May 2014 14:20:06 +0000 (15:20 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 1 May 2014 14:20:06 +0000 (15:20 +0100)
src/libserver/dns.c
src/libserver/events.c

index 8d18ffc06abe2f8eac32154cc28e01432e452846..c1303e3ea371d677bb4885cdba135013ff626c73 100644 (file)
@@ -59,6 +59,11 @@ rspamd_dns_callback (struct rdns_reply *reply, gpointer ud)
 
        reqdata->cb (reply, reqdata->ud);
 
+       /*
+        * Ref event to avoid double unref by
+        * event removing
+        */
+       rdns_request_retain (reply->request);
        remove_normal_event (reqdata->session, rspamd_dns_fin_cb, reqdata->req);
 }
 
@@ -81,8 +86,6 @@ make_dns_request (struct rspamd_dns_resolver *resolver,
        if (req != NULL) {
                register_async_event (session, (event_finalizer_t)rspamd_dns_fin_cb, req,
                                g_quark_from_static_string ("dns resolver"));
-               /* Ref event to free it only when according async event is deleted from the session */
-               rdns_request_retain (req);
                reqdata->req = req;
        }
        else {
index 85843fd05562a5c2e75096042de9e8feae85f5bc..48dcb3444b812dcce60a99b5a1dcf270caf5a91f 100644 (file)
@@ -154,6 +154,9 @@ rspamd_session_destroy (gpointer k, gpointer v, gpointer unused)
        struct rspamd_async_event      *ev = v;
 
        /* Call event's finalizer */
+       msg_debug ("removed event on destroy: %p, subsystem: %s", ev->user_data,
+                       g_quark_to_string (ev->subsystem));
+
        if (ev->fin != NULL) {
                ev->fin (ev->user_data);
        }