]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve *_LAYERS: detect bad return code from module
authorVladimír Čunát <vladimir.cunat@nic.cz>
Sat, 13 Mar 2021 09:02:20 +0000 (10:02 +0100)
committerTomas Krizek <tomas.krizek@nic.cz>
Fri, 19 Mar 2021 12:52:08 +0000 (13:52 +0100)
Practical example was now in dnstap (060349c9).  This way we detect
such mistakes more often and closer to their point of origin.

lib/resolve.c

index 521b97efb20cd2e3568c1b6cbf4f0871061e2189..8bfd69072038e289e24825cedf6a328d34728d23 100644 (file)
@@ -111,6 +111,12 @@ static int answer_finalize_yield(kr_layer_t *ctx) { return kr_ok(); }
                        struct kr_layer layer = {.state = (r)->state, .api = mod->layer, .req = (r)}; \
                        if (layer.api && layer.api->func) { \
                                (r)->state = layer.api->func(&layer, ##__VA_ARGS__); \
+                               /* It's an easy mistake to return error code, for example. */ \
+                               /* (though we could allow such an overload later) */ \
+                               if (unlikely(!kr_state_consistent((r)->state))) { \
+                                       assert(!EINVAL); \
+                                       (r)->state = KR_STATE_FAIL; \
+                               } else \
                                if ((r)->state == KR_STATE_YIELD) { \
                                        func ## _yield(&layer, ##__VA_ARGS__); \
                                        break; \