aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2022-01-05 10:00:17 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2022-01-05 10:00:17 +0000
commit3b0e294c489334153de206452b4319558343e8d5 (patch)
tree77a73d53b000ba86305c455e582901ed07f39bac /contrib
parent5abc2e4b45134c79bc4989744261ccb00675be56 (diff)
downloadrspamd-3b0e294c489334153de206452b4319558343e8d5.tar.gz
rspamd-3b0e294c489334153de206452b4319558343e8d5.zip
[Project] Rdns: Add timeout logic for TCP requests
Diffstat (limited to 'contrib')
-rw-r--r--contrib/librdns/resolver.c13
-rw-r--r--contrib/librdns/util.c6
2 files changed, 19 insertions, 0 deletions
diff --git a/contrib/librdns/resolver.c b/contrib/librdns/resolver.c
index a86dd4030..4193d6d28 100644
--- a/contrib/librdns/resolver.c
+++ b/contrib/librdns/resolver.c
@@ -498,6 +498,9 @@ rdns_reschedule_req_over_tcp (struct rdns_request *req, struct rdns_server *serv
}
}
+ req->async_event = resolver->async->add_timer (resolver->async->data,
+ req->timeout, req);
+
kh_value(req->io->requests, k) = req;
REF_RETAIN(ioc);
REF_RELEASE(old_ioc);
@@ -618,6 +621,16 @@ rdns_process_timer (void *arg)
UPSTREAM_FAIL (req->io->srv, time (NULL));
}
+ if (req->state == RDNS_REQUEST_TCP) {
+ rep = rdns_make_reply (req, RDNS_RC_TIMEOUT);
+ rdns_request_unschedule (req);
+ req->state = RDNS_REQUEST_REPLIED;
+ req->func (rep, req->arg);
+ REF_RELEASE (req);
+
+ return;
+ }
+
if (req->retransmits == 0) {
rep = rdns_make_reply (req, RDNS_RC_TIMEOUT);
diff --git a/contrib/librdns/util.c b/contrib/librdns/util.c
index 9ced3ebd4..b7e1a2011 100644
--- a/contrib/librdns/util.c
+++ b/contrib/librdns/util.c
@@ -643,6 +643,12 @@ rdns_request_unschedule (struct rdns_request *req)
req->async_event = NULL;
}
}
+ else if (req->state == RDNS_REQUEST_TCP) {
+ req->async->del_timer(req->async->data,
+ req->async_event);
+
+ req->async_event = NULL;
+ }
}
void