From: Tomas Krizek Date: Wed, 27 Oct 2021 14:32:18 +0000 (+0200) Subject: modules/extended_error: OPT section modification X-Git-Tag: v5.5.0~26^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abe02f8f2eedc4aa677a45ee89c543f384a775c1;p=thirdparty%2Fknot-resolver.git modules/extended_error: OPT section modification --- diff --git a/daemon/lua/sandbox.lua.in b/daemon/lua/sandbox.lua.in index f71ed3586..7c6a818bb 100644 --- a/daemon/lua/sandbox.lua.in +++ b/daemon/lua/sandbox.lua.in @@ -509,6 +509,7 @@ modules.load('ta_sentinel') modules.load('edns_keepalive') modules.load('refuse_nord') modules.load('watchdog') +modules.load('extended_error') -- Load keyfile_default trust_anchors.add_file('@keyfile_default@', @unmanaged@) diff --git a/daemon/worker.c b/daemon/worker.c index 73a1900f9..c8bceffd1 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -391,6 +391,7 @@ static struct request_ctx *request_create(struct worker_ctx *worker, req->vars_ref = LUA_NOREF; req->uid = uid; req->qsource.flags.xdp = is_xdp; + kr_request_set_extended_error(req, KNOT_EDNS_EDE_NONE, NULL); array_init(req->qsource.headers); if (session) { req->qsource.flags.tcp = session_get_handle(session)->type == UV_TCP; diff --git a/lib/defines.h b/lib/defines.h index 618903f46..226f7216f 100644 --- a/lib/defines.h +++ b/lib/defines.h @@ -8,6 +8,7 @@ #include #include #include +#include /* Function attributes */ #if __GNUC__ >= 4 @@ -70,6 +71,11 @@ static inline int KR_COLD kr_error(int x) { #define KR_DNAME_STR_MAXLEN (KNOT_DNAME_TXT_MAXLEN + 1) #define KR_RRTYPE_STR_MAXLEN (16 + 1) +/* Compatibility with libknot<3.1.0 */ +#if KNOT_VERSION_HEX < 0x030100 +#define KNOT_EDNS_EDE_NONE (-1) +#endif + /* * Address sanitizer hints. */ diff --git a/modules/extended_error/extended_error.c b/modules/extended_error/extended_error.c new file mode 100644 index 000000000..db0ed577d --- /dev/null +++ b/modules/extended_error/extended_error.c @@ -0,0 +1,47 @@ +#include + +#include "lib/module.h" +#include "daemon/engine.h" + +static int extended_error_finalize(kr_layer_t *ctx) { + struct kr_request *req = ctx->req; + const knot_rrset_t *src_opt = req->qsource.packet->opt_rr; + const struct kr_extended_error *ede = &req->extended_error; + + if (ede->info_code == KNOT_EDNS_EDE_NONE /* no extended error */ + || src_opt == NULL /* no EDNS in query */ + || kr_fails_assert(ede->info_code >= 0 && ede->info_code < UINT16_MAX) /* info code out of range */ + || kr_fails_assert(req->answer->opt_rr) /* sanity check - answer should have EDNS */ + ) { + return ctx->state; + } + + const uint16_t info_code = (uint16_t)ede->info_code; + const size_t extra_len = ede->extra_text ? strlen(ede->extra_text) : 0; + uint8_t buf[sizeof(info_code) + extra_len]; + knot_wire_write_u16(buf, info_code); + if (extra_len) + memcpy(buf + sizeof(info_code), ede->extra_text, extra_len); + + if (knot_edns_add_option(req->answer->opt_rr, KNOT_EDNS_OPTION_EDE, + sizeof(buf), buf, &req->pool) != KNOT_EOK) { + /* something went wrong and there is no way to salvage content of OPT RRset */ + kr_log_req(req, 0, 0, EDE, "unable to add Extended Error option\n"); + knot_rrset_clear(req->answer->opt_rr, &req->pool); + } + + return ctx->state; +} + +KR_EXPORT +int extended_error_init(struct kr_module *module) { + static kr_layer_api_t layer = { + .answer_finalize = &extended_error_finalize, + }; + layer.data = module; + module->layer = &layer; + + return kr_ok(); +} + +KR_MODULE_EXPORT(extended_error) diff --git a/modules/extended_error/meson.build b/modules/extended_error/meson.build new file mode 100644 index 000000000..26e87b0c6 --- /dev/null +++ b/modules/extended_error/meson.build @@ -0,0 +1,20 @@ +# C module: extended_error +# SPDX-License-Identifier: GPL-3.0-or-later + +extended_error_src = files([ + 'extended_error.c', +]) +c_src_lint += extended_error_src + +extended_error_mod = shared_module( + 'extended_error', + extended_error_src, + dependencies: [ + libknot, + luajit_inc, + ], + include_directories: mod_inc_dir, + name_prefix: '', + install: true, + install_dir: modules_dir, +) diff --git a/modules/meson.build b/modules/meson.build index cf03859b3..6ac4f8bd9 100644 --- a/modules/meson.build +++ b/modules/meson.build @@ -42,6 +42,7 @@ subdir('daf') subdir('dnstap') subdir('edns_keepalive') subdir('experimental_dot_auth') +subdir('extended_error') subdir('hints') subdir('http') subdir('nsid')