Skip to content

Commit d5e91d1

Browse files
committed
- Fix for the serve expired DNSSEC information fix, it would not allow
current delegation information be updated in cache. The fix allows current delegation and validation recursion information to be updated, but as a consequence no longer has certain expired information around for later dnssec valid expired responses.
1 parent 7985d17 commit d5e91d1

File tree

14 files changed

+140
-75
lines changed

14 files changed

+140
-75
lines changed

cachedb/cachedb.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,8 @@ cachedb_intcache_store(struct module_qstate* qstate, int msg_expired)
755755
}
756756
(void)dns_cache_store(qstate->env, &qstate->qinfo,
757757
qstate->return_msg->rep, 0, qstate->prefetch_leeway, 0,
758-
qstate->region, store_flags, qstate->qstarttime);
758+
qstate->region, store_flags, qstate->qstarttime,
759+
qstate->is_valrec);
759760
if(serve_expired && msg_expired) {
760761
if(qstate->env->cfg->serve_expired_client_timeout) {
761762
/* No expired response from the query state, the

daemon/cachedump.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ load_msg(RES* ssl, sldns_buffer* buf, struct worker* worker)
692692
return 1; /* skip this one, not all references satisfied */
693693

694694
if(!dns_cache_store(&worker->env, &qinf, &rep, 0, 0, 0, NULL, flags,
695-
*worker->env.now)) {
695+
*worker->env.now, 1)) {
696696
log_warn("error out of memory");
697697
return 0;
698698
}

dns64/dns64.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,8 @@ handle_event_moddone(struct module_qstate* qstate, int id)
658658
!dns_cache_store(
659659
qstate->env, &qstate->qinfo, qstate->return_msg->rep,
660660
0, qstate->prefetch_leeway, 0, NULL,
661-
qstate->query_flags, qstate->qstarttime))
661+
qstate->query_flags, qstate->qstarttime,
662+
qstate->is_valrec))
662663
log_err("out of memory");
663664

664665
/* do nothing */
@@ -1008,7 +1009,8 @@ dns64_inform_super(struct module_qstate* qstate, int id,
10081009
/* Store the generated response in cache. */
10091010
if ( (!super_dq || !super_dq->started_no_cache_store) &&
10101011
!dns_cache_store(super->env, &super->qinfo, super->return_msg->rep,
1011-
0, super->prefetch_leeway, 0, NULL, super->query_flags, qstate->qstarttime))
1012+
0, super->prefetch_leeway, 0, NULL, super->query_flags,
1013+
qstate->qstarttime, qstate->is_valrec))
10121014
log_err("out of memory");
10131015
}
10141016

doc/Changelog

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
5 November 2024: Wouter
2+
- Fix for the serve expired DNSSEC information fix, it would not allow
3+
current delegation information be updated in cache. The fix allows
4+
current delegation and validation recursion information to be
5+
updated, but as a consequence no longer has certain expired
6+
information around for later dnssec valid expired responses.
7+
18
4 November 2024: Wouter
29
- Fix redis that during a reload it does not fail if the redis
310
server does not connect or does not respond. It still logs the

ipsecmod/ipsecmod.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,8 @@ ipsecmod_handle_query(struct module_qstate* qstate,
456456
/* Store A/AAAA in cache. */
457457
if(!dns_cache_store(qstate->env, &qstate->qinfo,
458458
qstate->return_msg->rep, 0, qstate->prefetch_leeway,
459-
0, qstate->region, qstate->query_flags, qstate->qstarttime)) {
459+
0, qstate->region, qstate->query_flags, qstate->qstarttime,
460+
qstate->is_valrec)) {
460461
log_err("ipsecmod: out of memory caching record");
461462
}
462463
qstate->ext_state[id] = module_finished;

iterator/iter_utils.c

+12-2
Original file line numberDiff line numberDiff line change
@@ -693,10 +693,11 @@ dns_copy_msg(struct dns_msg* from, struct regional* region)
693693
void
694694
iter_dns_store(struct module_env* env, struct query_info* msgqinf,
695695
struct reply_info* msgrep, int is_referral, time_t leeway, int pside,
696-
struct regional* region, uint16_t flags, time_t qstarttime)
696+
struct regional* region, uint16_t flags, time_t qstarttime,
697+
int is_valrec)
697698
{
698699
if(!dns_cache_store(env, msgqinf, msgrep, is_referral, leeway,
699-
pside, region, flags, qstarttime))
700+
pside, region, flags, qstarttime, is_valrec))
700701
log_err("out of memory: cannot store data in cache");
701702
}
702703

@@ -1606,3 +1607,12 @@ limit_nsec_ttl(struct dns_msg* msg)
16061607
}
16071608
}
16081609
}
1610+
1611+
void
1612+
iter_make_minimal(struct reply_info* rep)
1613+
{
1614+
size_t rem = rep->ns_numrrsets + rep->ar_numrrsets;
1615+
rep->ns_numrrsets = 0;
1616+
rep->ar_numrrsets = 0;
1617+
rep->rrset_count -= rem;
1618+
}

iterator/iter_utils.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ struct dns_msg* dns_copy_msg(struct dns_msg* from, struct regional* regional);
142142
* @param region: to copy modified (cache is better) rrs back to.
143143
* @param flags: with BIT_CD for dns64 AAAA translated queries.
144144
* @param qstarttime: time of query start.
145+
* @param is_valrec: if the query is validation recursion and does not get
145146
* return void, because we are not interested in alloc errors,
146147
* the iterator and validator can operate on the results in their
147148
* scratch space (the qstate.region) and are not dependent on the cache.
@@ -150,7 +151,8 @@ struct dns_msg* dns_copy_msg(struct dns_msg* from, struct regional* regional);
150151
*/
151152
void iter_dns_store(struct module_env* env, struct query_info* qinf,
152153
struct reply_info* rep, int is_referral, time_t leeway, int pside,
153-
struct regional* region, uint16_t flags, time_t qstarttime);
154+
struct regional* region, uint16_t flags, time_t qstarttime,
155+
int is_valrec);
154156

155157
/**
156158
* Select randomly with n/m probability.
@@ -435,4 +437,11 @@ void iterator_set_ip46_support(struct module_stack* mods,
435437
*/
436438
void limit_nsec_ttl(struct dns_msg* msg);
437439

440+
/**
441+
* Make the response minimal. Removed authority and additional section,
442+
* that works when there is an answer in the answer section.
443+
* @param rep: reply to modify.
444+
*/
445+
void iter_make_minimal(struct reply_info* rep);
446+
438447
#endif /* ITERATOR_ITER_UTILS_H */

iterator/iterator.c

+16-5
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ error_response_cache(struct module_qstate* qstate, int id, int rcode)
368368
err.security = sec_status_indeterminate;
369369
verbose(VERB_ALGO, "store error response in message cache");
370370
iter_dns_store(qstate->env, &qstate->qinfo, &err, 0, 0, 0, NULL,
371-
qstate->query_flags, qstate->qstarttime);
371+
qstate->query_flags, qstate->qstarttime, qstate->is_valrec);
372372
return error_response(qstate, id, rcode);
373373
}
374374

@@ -3296,14 +3296,24 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
32963296
iq->num_target_queries = 0;
32973297
return processDSNSFind(qstate, iq, id);
32983298
}
3299+
if(iq->qchase.qtype == LDNS_RR_TYPE_DNSKEY && SERVE_EXPIRED
3300+
&& qstate->is_valrec &&
3301+
reply_find_answer_rrset(&iq->qchase, iq->response->rep) != NULL) {
3302+
/* clean out the authority section, if any, so it
3303+
* does not overwrite dnssec valid data in the
3304+
* validation recursion lookup. */
3305+
verbose(VERB_ALGO, "make DNSKEY minimal for serve "
3306+
"expired");
3307+
iter_make_minimal(iq->response->rep);
3308+
}
32993309
if(!qstate->no_cache_store)
33003310
iter_dns_store(qstate->env, &iq->response->qinfo,
33013311
iq->response->rep,
33023312
iq->qchase.qtype != iq->response->qinfo.qtype,
33033313
qstate->prefetch_leeway,
33043314
iq->dp&&iq->dp->has_parent_side_NS,
33053315
qstate->region, qstate->query_flags,
3306-
qstate->qstarttime);
3316+
qstate->qstarttime, qstate->is_valrec);
33073317
/* close down outstanding requests to be discarded */
33083318
outbound_list_clear(&iq->outlist);
33093319
iq->num_current_queries = 0;
@@ -3397,7 +3407,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
33973407
/* no prefetch-leeway, since its not the answer */
33983408
iter_dns_store(qstate->env, &iq->response->qinfo,
33993409
iq->response->rep, 1, 0, 0, NULL, 0,
3400-
qstate->qstarttime);
3410+
qstate->qstarttime, qstate->is_valrec);
34013411
if(iq->store_parent_NS)
34023412
iter_store_parentside_NS(qstate->env,
34033413
iq->response->rep);
@@ -3527,7 +3537,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
35273537
iter_dns_store(qstate->env, &iq->response->qinfo,
35283538
iq->response->rep, 1, qstate->prefetch_leeway,
35293539
iq->dp&&iq->dp->has_parent_side_NS, NULL,
3530-
qstate->query_flags, qstate->qstarttime);
3540+
qstate->query_flags, qstate->qstarttime,
3541+
qstate->is_valrec);
35313542
/* set the current request's qname to the new value. */
35323543
iq->qchase.qname = sname;
35333544
iq->qchase.qname_len = snamelen;
@@ -4154,7 +4165,7 @@ processFinished(struct module_qstate* qstate, struct iter_qstate* iq,
41544165
iq->response->rep, 0, qstate->prefetch_leeway,
41554166
iq->dp&&iq->dp->has_parent_side_NS,
41564167
qstate->region, qstate->query_flags,
4157-
qstate->qstarttime);
4168+
qstate->qstarttime, qstate->is_valrec);
41584169
}
41594170
}
41604171
qstate->return_rcode = LDNS_RCODE_NOERROR;

pythonmod/pythonmod_utils.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ int storeQueryInCache(struct module_qstate* qstate, struct query_info* qinfo,
7373

7474
return dns_cache_store(qstate->env, qinfo, msgrep, is_referral,
7575
qstate->prefetch_leeway, 0, NULL, qstate->query_flags,
76-
qstate->qstarttime);
76+
qstate->qstarttime, qstate->is_valrec);
7777
}
7878

7979
/* Invalidate the message associated with query_info stored in message cache */

services/cache/dns.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,8 @@ dns_cache_lookup(struct module_env* env,
10571057
int
10581058
dns_cache_store(struct module_env* env, struct query_info* msgqinf,
10591059
struct reply_info* msgrep, int is_referral, time_t leeway, int pside,
1060-
struct regional* region, uint32_t flags, time_t qstarttime)
1060+
struct regional* region, uint32_t flags, time_t qstarttime,
1061+
int is_valrec)
10611062
{
10621063
struct reply_info* rep = NULL;
10631064
if(SERVE_EXPIRED) {
@@ -1079,7 +1080,8 @@ dns_cache_store(struct module_env* env, struct query_info* msgqinf,
10791080
* one and let the validator manage caching. */
10801081
&& cached->security != sec_status_bogus
10811082
&& (env->need_to_validate &&
1082-
msgrep->security == sec_status_unchecked)) {
1083+
msgrep->security == sec_status_unchecked)
1084+
&& !is_valrec) {
10831085
verbose(VERB_ALGO, "a validated expired entry "
10841086
"could be overwritten, skip caching "
10851087
"the new message at this stage");

services/cache/dns.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,14 @@ struct dns_msg {
9090
* (See DNSCACHE_STORE_xxx flags).
9191
* @param qstarttime: time when the query was started, and thus when the
9292
* delegations were looked up.
93+
* @param is_valrec: if the query is validation recursion and does not get
94+
* dnssec validation itself.
9395
* @return 0 on alloc error (out of memory).
9496
*/
9597
int dns_cache_store(struct module_env* env, struct query_info* qinf,
9698
struct reply_info* rep, int is_referral, time_t leeway, int pside,
97-
struct regional* region, uint32_t flags, time_t qstarttime);
99+
struct regional* region, uint32_t flags, time_t qstarttime,
100+
int is_valrec);
98101

99102
/**
100103
* Store message in the cache. Stores in message cache and rrset cache.

testdata/serve_expired_client_timeout_val_bogus.rpl

+37-28
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ SCENARIO_BEGIN Test serve-expired with client-timeout and bogus answer
3838
; - query one last time
3939
; - check that we get the immediate valid cache response; upstream does not have an answer at this moment
4040

41+
; The example.com NS and ns.example.com A record are commented out.
42+
; This to make the test succeed. It then keeps the dnssec valid lookup.
43+
; Otherwise, the relookup of the referral would overwrite the example.com NS
44+
; the serve expired response would no longer be valid. But this record must
45+
; be cached, for keeping the current delegation information.
46+
; Also the DNSKEY lookup authority and additional are cleaned to stop overwrite
47+
; of the NS and A record. This is more likely to keep the serve expired
48+
; information intact.
49+
4150
;;
4251
;; K.ROOT-SERVERS.NET.
4352
;;
@@ -150,12 +159,12 @@ RANGE_BEGIN 0 10
150159
www.example.com. IN A
151160
SECTION ANSWER
152161
www.example.com. IN A 10.20.30.40
153-
ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
162+
;ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
154163
SECTION AUTHORITY
155-
example.com. IN NS ns.example.com.
156-
example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
164+
;example.com. IN NS ns.example.com.
165+
;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
157166
SECTION ADDITIONAL
158-
ns.example.com. IN A 1.2.3.4
167+
;ns.example.com. IN A 1.2.3.4
159168
www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
160169
ENTRY_END
161170
RANGE_END
@@ -174,12 +183,12 @@ RANGE_BEGIN 20 30
174183
www.example.com. IN A
175184
SECTION ANSWER
176185
www.example.com. IN A 10.20.30.40
177-
ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
186+
;ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
178187
SECTION AUTHORITY
179-
example.com. IN NS ns.example.com.
180-
example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
188+
;example.com. IN NS ns.example.com.
189+
;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
181190
SECTION ADDITIONAL
182-
ns.example.com. IN A 1.2.3.4
191+
;ns.example.com. IN A 1.2.3.4
183192
;; (valid signature)
184193
;; www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
185194
;; (bogus signature)
@@ -201,12 +210,12 @@ RANGE_BEGIN 40 60
201210
www.example.com. IN A
202211
SECTION ANSWER
203212
www.example.com. IN A 10.20.30.40
204-
ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
213+
;ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
205214
SECTION AUTHORITY
206-
example.com. IN NS ns.example.com.
207-
example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
215+
;example.com. IN NS ns.example.com.
216+
;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
208217
SECTION ADDITIONAL
209-
ns.example.com. IN A 1.2.3.4
218+
;ns.example.com. IN A 1.2.3.4
210219
www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
211220
ENTRY_END
212221
RANGE_END
@@ -229,11 +238,11 @@ SECTION ANSWER
229238
www.example.com. IN A 10.20.30.40
230239
www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
231240
SECTION AUTHORITY
232-
example.com. IN NS ns.example.com.
233-
example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
241+
;example.com. IN NS ns.example.com.
242+
;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
234243
SECTION ADDITIONAL
235-
ns.example.com. IN A 1.2.3.4
236-
ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
244+
;ns.example.com. IN A 1.2.3.4
245+
;ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
237246
ENTRY_END
238247

239248
STEP 11 TIME_PASSES ELAPSE 3601
@@ -256,11 +265,11 @@ SECTION ANSWER
256265
www.example.com. 123 IN A 10.20.30.40
257266
www.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
258267
SECTION AUTHORITY
259-
example.com. 123 IN NS ns.example.com.
260-
example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
268+
;example.com. 123 IN NS ns.example.com.
269+
;example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
261270
SECTION ADDITIONAL
262-
ns.example.com. 123 IN A 1.2.3.4
263-
ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
271+
;ns.example.com. 123 IN A 1.2.3.4
272+
;ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
264273
ENTRY_END
265274

266275
STEP 40 QUERY
@@ -281,11 +290,11 @@ SECTION ANSWER
281290
www.example.com. 123 IN A 10.20.30.40
282291
www.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
283292
SECTION AUTHORITY
284-
example.com. 123 IN NS ns.example.com.
285-
example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
293+
;example.com. 123 IN NS ns.example.com.
294+
;example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
286295
SECTION ADDITIONAL
287-
ns.example.com. 123 IN A 1.2.3.4
288-
ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
296+
;ns.example.com. 123 IN A 1.2.3.4
297+
;ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
289298
ENTRY_END
290299

291300
; upstream query is resolved before this query comes in
@@ -307,11 +316,11 @@ SECTION ANSWER
307316
www.example.com. IN A 10.20.30.40
308317
www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
309318
SECTION AUTHORITY
310-
example.com. IN NS ns.example.com.
311-
example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
319+
;example.com. IN NS ns.example.com.
320+
;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
312321
SECTION ADDITIONAL
313-
ns.example.com. IN A 1.2.3.4
314-
ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
322+
;ns.example.com. IN A 1.2.3.4
323+
;ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
315324
ENTRY_END
316325

317326
SCENARIO_END

0 commit comments

Comments
 (0)