]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Another fix for rdns write errors
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 22 Sep 2016 08:24:28 +0000 (09:24 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 22 Sep 2016 08:27:45 +0000 (09:27 +0100)
Issue: #971

contrib/librdns/resolver.c

index 664d42026ca51dff78759b8708d83609aea1b0ff..329caa6206eccad57ae199863329862ab753619b 100644 (file)
@@ -347,6 +347,8 @@ rdns_process_timer (void *arg)
                        req->state = RDNS_REQUEST_REPLIED;
                        req->func (rep, req->arg);
                        REF_RELEASE (req);
+
+                       return;
                }
 
                /* Select random IO channel */
@@ -356,13 +358,20 @@ rdns_process_timer (void *arg)
                renew = true;
        }
 
+       /*
+        * Note: when `renew` is true, then send_request deals with the
+        * timers and events itself
+        */
        r = rdns_send_request (req, req->io->sock, renew);
        if (r == 0) {
                /* Retransmit one more time */
-               req->async->del_timer (req->async->data,
+               if (!renew) {
+                       req->async->del_timer (req->async->data,
                                        req->async_event);
-               req->async_event = req->async->add_write (req->async->data,
-                               req->io->sock, req);
+                       req->async_event = req->async->add_write (req->async->data,
+                                       req->io->sock, req);
+               }
+
                req->state = RDNS_REQUEST_WAIT_SEND;
        }
        else if (r == -1) {
@@ -374,6 +383,11 @@ rdns_process_timer (void *arg)
                        UPSTREAM_FAIL (req->io->srv, time (NULL));
                }
 
+               if (!renew) {
+                       req->async->del_timer (req->async->data,
+                                       req->async_event);
+               }
+
                /* We have not scheduled timeout actually due to send error */
                rep = rdns_make_reply (req, RDNS_RC_NETERR);
                req->state = RDNS_REQUEST_REPLIED;