From: Grigorii Demidov Date: Thu, 7 Sep 2017 13:09:24 +0000 (+0200) Subject: lib: additional checks when overall resolution time of single query is checked X-Git-Tag: v1.4.0~7^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c3614bd4cfb211e48c1f9ed0b0f9af70ead3b032;p=thirdparty%2Fknot-resolver.git lib: additional checks when overall resolution time of single query is checked --- diff --git a/lib/resolve.c b/lib/resolve.c index cd60412d8..e4b215a8f 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -860,6 +860,37 @@ static void update_nslist_score(struct kr_request *request, struct kr_query *qry } } +bool check_resolution_time(struct kr_query *qry, struct timeval *now) +{ + unsigned resolving_time = time_diff(&qry->creation_time, now); + if (resolving_time > KR_RESOLVE_TIME_LIMIT) { + WITH_VERBOSE { + VERBOSE_MSG(qry, "query resolution time limit exceeded\n"); + } + return false; + } + + /* If this is a subquery, check overall resolution time for parent */ + if (!qry->parent) { + return true; + } + + while (qry->parent) { + qry = qry->parent; + } + + /* qry here is an oldest ancestor */ + resolving_time = time_diff(&qry->creation_time, now); + if (resolving_time > KR_RESOLVE_TIME_LIMIT) { + /* oldest ancestor is too old */ + WITH_VERBOSE { + VERBOSE_MSG(qry, "query resolution time limit exceeded\n"); + } + return false; + } + return true; +} + int kr_resolve_consume(struct kr_request *request, const struct sockaddr *src, knot_pkt_t *packet) { struct kr_rplan *rplan = &request->rplan; @@ -876,11 +907,8 @@ int kr_resolve_consume(struct kr_request *request, const struct sockaddr *src, k struct kr_query *qry = array_tail(rplan->pending); struct timeval now; gettimeofday(&now, NULL); - unsigned resolving_time = time_diff(&qry->creation_time, &now); - if (resolving_time > KR_RESOLVE_TIME_LIMIT) { - WITH_VERBOSE { - VERBOSE_MSG(qry, "query resolution time limit exceeded %i\n", resolving_time); - } + /* Check overall resolution time */ + if (!check_resolution_time(qry, &now)) { return KR_STATE_FAIL; } bool tried_tcp = (qry->flags.TCP);