]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
modules/{policy,view}: do not act if FAIL or DONE
authorVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 12 Dec 2018 14:29:23 +0000 (15:29 +0100)
committerPetr Špaček <petr.spacek@nic.cz>
Thu, 13 Dec 2018 16:28:07 +0000 (17:28 +0100)
Not all actions are destructive, but it seems generally expected that if
an earlier module or other code already transitioned the request into
a FAIL or DONE state, we don't want to apply rules anymore.
In particular, later rule actions would "overwrite" what previous
actions did.

modules/policy/policy.lua
modules/view/view.lua

index 7a3fb6bbc52476695cb56d1e29676c832f048ecf..6e9492fb714d9728828a6beb1cee4d46df9a30ca 100644 (file)
@@ -549,12 +549,18 @@ end
 -- as a dependency chain, e.g. r1,r2,r3 -> r3(r2(r1(state)))
 policy.layer = {
        begin = function(state, req)
+               -- Don't act on "resolved" cases.
+               if bit.band(state, bit.bor(kres.FAIL, kres.DONE)) ~= 0 then return state end
+
                req = kres.request_t(req)
                return policy.evaluate(policy.rules, req, req:current(), state) or
                       policy.evaluate(policy.special_names, req, req:current(), state) or
                       state
        end,
        finish = function(state, req)
+               -- Don't act on "resolved" cases.
+               if bit.band(state, bit.bor(kres.FAIL, kres.DONE)) ~= 0 then return state end
+
                req = kres.request_t(req)
                return policy.evaluate(policy.postrules, req, req:current(), state) or state
        end
index 7e84ff29d158c0e41e3a542cbb91cccd7b3698bf..41157eb8d42be2166d2d8e03c1ba025be0cc6db3 100644 (file)
@@ -106,7 +106,9 @@ end
 -- @function Module layers
 view.layer = {
        begin = function(state, req)
-               if state == kres.FAIL then return state end
+               -- Don't act on "resolved" cases.
+               if bit.band(state, bit.bor(kres.FAIL, kres.DONE)) ~= 0 then return state end
+
                req = kres.request_t(req)
                evaluate(state, req)
                return req.state