]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
layer/iterate: bail if referral doesn't improve zone cut (loop)
authorMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 19 Jan 2015 23:18:16 +0000 (00:18 +0100)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 19 Jan 2015 23:18:16 +0000 (00:18 +0100)
lib/layer/iterate.c

index 7f84d7380805a852d6a18b1eba4e311ed80b0522..951254bba2a7cf3591c672e7336d9766cfb1a14d 100644 (file)
@@ -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)