From: George Thessalonikefs Date: Sun, 30 Jul 2023 10:28:28 +0000 (+0200) Subject: Merge branch 'master' into features/ede-caching-cachedb X-Git-Tag: release-1.18.0rc1~24 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f97927a47e870e02bd3ea3c7b83c140953cf1655;p=thirdparty%2Funbound.git Merge branch 'master' into features/ede-caching-cachedb --- f97927a47e870e02bd3ea3c7b83c140953cf1655 diff --cc cachedb/cachedb.c index f10005c3d,f40f4e15d..edaa8976b --- a/cachedb/cachedb.c +++ b/cachedb/cachedb.c @@@ -557,25 -545,6 +553,24 @@@ parse_data(struct module_qstate* qstate if(!qstate->return_msg) return 0; + /* We find the EDE in the in-list after parsing */ + if(qstate->env->cfg->ede && + (ede = edns_opt_list_find(edns.opt_list_in, LDNS_EDNS_EDE))) { + if(ede->opt_len >= 2) { + qstate->return_msg->rep->reason_bogus = + sldns_read_uint16(ede->opt_data); + } + /* allocate space and store the error string and it's size */ + if(ede->opt_len > 2) { + size_t ede_len = ede->opt_len - 2; + qstate->return_msg->rep->reason_bogus_str = regional_alloc( + qstate->region, sizeof(char) * (ede_len+1)); + memcpy(qstate->return_msg->rep->reason_bogus_str, + ede->opt_data+2, ede_len); + qstate->return_msg->rep->reason_bogus_str[ede_len] = 0; - qstate->return_msg->rep->reason_bogus_str_size = ede_len; + } + } + qstate->return_rcode = LDNS_RCODE_NOERROR; /* see how much of the TTL expired, and remove it */ diff --cc services/cache/dns.c index 3e9015c4a,a3d029231..9b4ad5888 --- a/services/cache/dns.c +++ b/services/cache/dns.c @@@ -613,8 -592,6 +592,7 @@@ gen_dns_msg(struct regional* region, st if(!msg->rep) return NULL; msg->rep->reason_bogus = LDNS_EDE_NONE; - msg->rep->reason_bogus_str_size = 0; + msg->rep->reason_bogus_str = NULL; if(num > RR_COUNT_MAX) return NULL; /* integer overflow protection */ msg->rep->rrsets = (struct ub_packed_rrset_key**) @@@ -669,11 -654,6 +655,10 @@@ tomsg(struct module_env* env, struct qu msg->rep->rrset_count = r->rrset_count; msg->rep->authoritative = r->authoritative; msg->rep->reason_bogus = r->reason_bogus; - if (r->reason_bogus_str_size > 0) { ++ if(r->reason_bogus_str) { + msg->rep->reason_bogus_str = regional_strdup(region, r->reason_bogus_str); - msg->rep->reason_bogus_str_size = r->reason_bogus_str_size; + } + if(!rrset_array_lock(r->ref, r->rrset_count, now_control)) { return NULL; } diff --cc testdata/cachedb_cached_ede.crpl index 55d61e74e,000000000..5eade5451 mode 100644,000000..100644 --- a/testdata/cachedb_cached_ede.crpl +++ b/testdata/cachedb_cached_ede.crpl @@@ -1,90 -1,0 +1,91 @@@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + qname-minimisation: no + minimal-responses: no + module-config: "cachedb validator iterator" + trust-anchor-signaling: no ++ verbosity: 4 + ede: yes + val-log-level: 2 + trust-anchor: "example.nl. DS 50602 8 2 FA8EE175C47325F4BD46D8A4083C3EBEB11C977D689069F2B41F1A29B22446B1" + + +cachedb: + backend: "testframe" + secret-seed: "testvalue" + +stub-zone: + name: "example.nl" + stub-addr: 193.0.14.129 +CONFIG_END + +SCENARIO_BEGIN Test cachedb support for caching EDEs. + +RANGE_BEGIN 0 10 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.nl. IN DNSKEY +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.nl. IN A +SECTION ANSWER +example.nl. IN A 1.2.3.4 +ENTRY_END +RANGE_END + +; get the entry in cache. +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD DO +SECTION QUESTION +example.nl. IN A +SECTION ADDITIONAL + HEX_EDNSDATA_BEGIN - C0 00 ; option code = 49152 ++ FF FE ; option code = 65534 (LDNS_EDNS_UNBOUND_CACHEDB_TESTFRAME_TEST) + 00 00 ; option length + HEX_EDNSDATA_END +ENTRY_END + +; get the answer for it +STEP 10 CHECK_ANSWER +ENTRY_BEGIN +MATCH all ede=9 +REPLY QR RD RA DO SERVFAIL +SECTION QUESTION +example.nl. IN A +ENTRY_END + +; query again for the cached entry +STEP 20 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +example.nl. IN A +SECTION ADDITIONAL + HEX_EDNSDATA_BEGIN - C0 00 ; option code = 49152 ++ FF FE ; option code = 65534 (LDNS_EDNS_UNBOUND_CACHEDB_TESTFRAME_TEST) + 00 00 ; option length + HEX_EDNSDATA_END +ENTRY_END + +; this must be a cached answer since stub is not answering in this range +STEP 30 CHECK_ANSWER +ENTRY_BEGIN +MATCH all ede=9 +REPLY QR RD RA DO SERVFAIL +SECTION QUESTION +example.nl. IN A +ENTRY_END + +SCENARIO_END