diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2022-01-05 10:00:17 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2022-01-05 10:00:17 +0000 |
commit | 3b0e294c489334153de206452b4319558343e8d5 (patch) | |
tree | 77a73d53b000ba86305c455e582901ed07f39bac /contrib | |
parent | 5abc2e4b45134c79bc4989744261ccb00675be56 (diff) | |
download | rspamd-3b0e294c489334153de206452b4319558343e8d5.tar.gz rspamd-3b0e294c489334153de206452b4319558343e8d5.zip |
[Project] Rdns: Add timeout logic for TCP requests
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/librdns/resolver.c | 13 | ||||
-rw-r--r-- | contrib/librdns/util.c | 6 |
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 |