From: Vladimír Čunát Date: Sat, 13 Mar 2021 09:02:20 +0000 (+0100) Subject: lib/resolve *_LAYERS: detect bad return code from module X-Git-Tag: v5.3.1~5^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3e800889035fe5cdba95418bf892f285fde8724;p=thirdparty%2Fknot-resolver.git lib/resolve *_LAYERS: detect bad return code from module Practical example was now in dnstap (060349c9). This way we detect such mistakes more often and closer to their point of origin. --- diff --git a/lib/resolve.c b/lib/resolve.c index 521b97efb..8bfd69072 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -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; \