From: Marek VavruĊĦa Date: Mon, 19 Jan 2015 23:18:16 +0000 (+0100) Subject: layer/iterate: bail if referral doesn't improve zone cut (loop) X-Git-Tag: v1.0.0-beta1~359 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e9669b3133e534921454eaac32148be1bb28e4f;p=thirdparty%2Fknot-resolver.git layer/iterate: bail if referral doesn't improve zone cut (loop) --- diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 7f84d7380..951254bba 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -120,6 +120,9 @@ static int update_zone_cut(knot_pkt_t *pkt, struct kr_rplan *rplan, const knot_r /* Set the first nameserver address, rest will be cached. */ if (!knot_dname_is_equal(rr->owner, rplan->zone_cut.name)) { ret = set_zone_cut(rplan, pkt, rr); + } else { + /* Zone cut not updated, referral loop. */ + ret = KNOT_EINVAL; } } @@ -136,12 +139,18 @@ static int resolve_referral(knot_pkt_t *pkt, struct kr_layer_param *param) continue; } int ret = update_zone_cut(pkt, param->rplan, rr); - if (ret != KNOT_EOK) { - return KNOT_NS_PROC_FAIL; + if (ret == KNOT_EOK) { + return KNOT_NS_PROC_DONE; } } - return KNOT_NS_PROC_DONE; + /* Dead end, either bogus or loop referral. */ + struct kr_query *cur = kr_rplan_current(param->rplan); + if (cur != NULL) { + kr_rplan_pop(param->rplan, cur); + } + + return KNOT_NS_PROC_FAIL; } static int resolve_auth(knot_pkt_t *pkt, struct kr_layer_param *param)