]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
modules/extended_error: OPT section modification
authorTomas Krizek <tomas.krizek@nic.cz>
Wed, 27 Oct 2021 14:32:18 +0000 (16:32 +0200)
committerTomas Krizek <tomas.krizek@nic.cz>
Tue, 21 Dec 2021 14:02:08 +0000 (15:02 +0100)
daemon/lua/sandbox.lua.in
daemon/worker.c
lib/defines.h
modules/extended_error/extended_error.c [new file with mode: 0644]
modules/extended_error/meson.build [new file with mode: 0644]
modules/meson.build

index f71ed3586fba9ca0b49e57985eae2e4766507eea..7c6a818bb1d16367e85f490f8af2aab6ab3a317b 100644 (file)
@@ -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@)
index 73a1900f9369a0e23d06849ef7f33efe6233409b..c8bceffd17cf0649d778fbbf2d48d579674fa508 100644 (file)
@@ -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;
index 618903f46e70d92efd83b93faa45fdddffce3ca4..226f7216f0849c69fa809af65768e464c09819d8 100644 (file)
@@ -8,6 +8,7 @@
 #include <libknot/errcode.h>
 #include <libknot/dname.h>
 #include <libknot/rrset.h>
+#include <libknot/version.h>
 
 /* 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 (file)
index 0000000..db0ed57
--- /dev/null
@@ -0,0 +1,47 @@
+#include <libknot/rrtype/opt.h>
+
+#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 (file)
index 0000000..26e87b0
--- /dev/null
@@ -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,
+)
index cf03859b361a5c95e99dd1524d52537bdc6d57df..6ac4f8bd945941259f1e22fb6a50ec6db201be62 100644 (file)
@@ -42,6 +42,7 @@ subdir('daf')
 subdir('dnstap')
 subdir('edns_keepalive')
 subdir('experimental_dot_auth')
+subdir('extended_error')
 subdir('hints')
 subdir('http')
 subdir('nsid')