xfrin.c revision 1.1.1.12 1 /* $NetBSD: xfrin.c,v 1.1.1.12 2024/02/21 21:54:52 christos Exp $ */
2
3 /*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16 /*! \file */
17
18 #include <inttypes.h>
19 #include <stdbool.h>
20
21 #include <isc/mem.h>
22 #include <isc/netmgr.h>
23 #include <isc/print.h>
24 #include <isc/random.h>
25 #include <isc/result.h>
26 #include <isc/string.h> /* Required for HP/UX (and others?) */
27 #include <isc/task.h>
28 #include <isc/timer.h>
29 #include <isc/util.h>
30
31 #include <dns/callbacks.h>
32 #include <dns/catz.h>
33 #include <dns/db.h>
34 #include <dns/diff.h>
35 #include <dns/events.h>
36 #include <dns/journal.h>
37 #include <dns/log.h>
38 #include <dns/message.h>
39 #include <dns/rdataclass.h>
40 #include <dns/rdatalist.h>
41 #include <dns/rdataset.h>
42 #include <dns/result.h>
43 #include <dns/soa.h>
44 #include <dns/transport.h>
45 #include <dns/tsig.h>
46 #include <dns/view.h>
47 #include <dns/xfrin.h>
48 #include <dns/zone.h>
49
50 #include <dst/dst.h>
51
52 /*
53 * Incoming AXFR and IXFR.
54 */
55
56 /*%
57 * It would be non-sensical (or at least obtuse) to use FAIL() with an
58 * ISC_R_SUCCESS code, but the test is there to keep the Solaris compiler
59 * from complaining about "end-of-loop code not reached".
60 */
61 #define FAIL(code) \
62 do { \
63 result = (code); \
64 if (result != ISC_R_SUCCESS) \
65 goto failure; \
66 } while (0)
67
68 #define CHECK(op) \
69 do { \
70 result = (op); \
71 if (result != ISC_R_SUCCESS) \
72 goto failure; \
73 } while (0)
74
75 /*%
76 * The states of the *XFR state machine. We handle both IXFR and AXFR
77 * with a single integrated state machine because they cannot be distinguished
78 * immediately - an AXFR response to an IXFR request can only be detected
79 * when the first two (2) response RRs have already been received.
80 */
81 typedef enum {
82 XFRST_SOAQUERY,
83 XFRST_GOTSOA,
84 XFRST_INITIALSOA,
85 XFRST_FIRSTDATA,
86 XFRST_IXFR_DELSOA,
87 XFRST_IXFR_DEL,
88 XFRST_IXFR_ADDSOA,
89 XFRST_IXFR_ADD,
90 XFRST_IXFR_END,
91 XFRST_AXFR,
92 XFRST_AXFR_END
93 } xfrin_state_t;
94
95 /*%
96 * Incoming zone transfer context.
97 */
98
99 struct dns_xfrin_ctx {
100 unsigned int magic;
101 isc_mem_t *mctx;
102 dns_zone_t *zone;
103
104 isc_refcount_t references;
105
106 isc_nm_t *netmgr;
107
108 isc_refcount_t connects; /*%< Connect in progress */
109 isc_refcount_t sends; /*%< Send in progress */
110 isc_refcount_t recvs; /*%< Receive in progress */
111
112 atomic_bool shuttingdown;
113
114 isc_result_t shutdown_result;
115
116 dns_name_t name; /*%< Name of zone to transfer */
117 dns_rdataclass_t rdclass;
118
119 dns_messageid_t id;
120
121 /*%
122 * Requested transfer type (dns_rdatatype_axfr or
123 * dns_rdatatype_ixfr). The actual transfer type
124 * may differ due to IXFR->AXFR fallback.
125 */
126 dns_rdatatype_t reqtype;
127
128 isc_sockaddr_t primaryaddr;
129 isc_sockaddr_t sourceaddr;
130
131 isc_nmhandle_t *handle;
132 isc_nmhandle_t *readhandle;
133 isc_nmhandle_t *sendhandle;
134
135 /*% Buffer for IXFR/AXFR request message */
136 isc_buffer_t qbuffer;
137 unsigned char qbuffer_data[512];
138
139 /*%
140 * Whether the zone originally had a database attached at the time this
141 * transfer context was created. Used by xfrin_destroy() when making
142 * logging decisions.
143 */
144 bool zone_had_db;
145
146 dns_db_t *db;
147 dns_dbversion_t *ver;
148 dns_diff_t diff; /*%< Pending database changes */
149 int difflen; /*%< Number of pending tuples */
150
151 xfrin_state_t state;
152 uint32_t end_serial;
153 bool is_ixfr;
154
155 unsigned int nmsg; /*%< Number of messages recvd */
156 unsigned int nrecs; /*%< Number of records recvd */
157 uint64_t nbytes; /*%< Number of bytes received */
158
159 unsigned int maxrecords; /*%< The maximum number of
160 * records set for the zone */
161
162 isc_time_t start; /*%< Start time of the transfer */
163 isc_time_t end; /*%< End time of the transfer */
164
165 dns_tsigkey_t *tsigkey; /*%< Key used to create TSIG */
166 isc_buffer_t *lasttsig; /*%< The last TSIG */
167 dst_context_t *tsigctx; /*%< TSIG verification context */
168 unsigned int sincetsig; /*%< recvd since the last TSIG */
169
170 dns_transport_t *transport;
171
172 dns_xfrindone_t done;
173
174 /*%
175 * AXFR- and IXFR-specific data. Only one is used at a time
176 * according to the is_ixfr flag, so this could be a union,
177 * but keeping them separate makes it a bit simpler to clean
178 * things up when destroying the context.
179 */
180 dns_rdatacallbacks_t axfr;
181
182 struct {
183 uint32_t request_serial;
184 uint32_t current_serial;
185 dns_journal_t *journal;
186 } ixfr;
187
188 dns_rdata_t firstsoa;
189 unsigned char *firstsoa_data;
190
191 isc_tlsctx_cache_t *tlsctx_cache;
192
193 isc_timer_t *max_time_timer;
194 isc_timer_t *max_idle_timer;
195 };
196
197 #define XFRIN_MAGIC ISC_MAGIC('X', 'f', 'r', 'I')
198 #define VALID_XFRIN(x) ISC_MAGIC_VALID(x, XFRIN_MAGIC)
199
200 /**************************************************************************/
201 /*
202 * Forward declarations.
203 */
204
205 static void
206 xfrin_create(isc_mem_t *mctx, dns_zone_t *zone, dns_db_t *db, isc_nm_t *netmgr,
207 dns_name_t *zonename, dns_rdataclass_t rdclass,
208 dns_rdatatype_t reqtype, const isc_sockaddr_t *primaryaddr,
209 const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
210 dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
211 dns_xfrin_ctx_t **xfrp);
212
213 static isc_result_t
214 axfr_init(dns_xfrin_ctx_t *xfr);
215 static isc_result_t
216 axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp);
217 static isc_result_t
218 axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
219 dns_ttl_t ttl, dns_rdata_t *rdata);
220 static isc_result_t
221 axfr_apply(dns_xfrin_ctx_t *xfr);
222 static isc_result_t
223 axfr_commit(dns_xfrin_ctx_t *xfr);
224 static isc_result_t
225 axfr_finalize(dns_xfrin_ctx_t *xfr);
226
227 static isc_result_t
228 ixfr_init(dns_xfrin_ctx_t *xfr);
229 static isc_result_t
230 ixfr_apply(dns_xfrin_ctx_t *xfr);
231 static isc_result_t
232 ixfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
233 dns_ttl_t ttl, dns_rdata_t *rdata);
234 static isc_result_t
235 ixfr_commit(dns_xfrin_ctx_t *xfr);
236
237 static isc_result_t
238 xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, uint32_t ttl,
239 dns_rdata_t *rdata);
240
241 static isc_result_t
242 xfrin_start(dns_xfrin_ctx_t *xfr);
243
244 static void
245 xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg);
246 static isc_result_t
247 xfrin_send_request(dns_xfrin_ctx_t *xfr);
248 static void
249 xfrin_send_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg);
250 static void
251 xfrin_recv_done(isc_nmhandle_t *handle, isc_result_t result,
252 isc_region_t *region, void *cbarg);
253
254 static void
255 xfrin_destroy(dns_xfrin_ctx_t *xfr);
256
257 static void
258 xfrin_timedout(struct isc_task *, struct isc_event *);
259 static void
260 xfrin_idledout(struct isc_task *, struct isc_event *);
261 static void
262 xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg);
263 static isc_result_t
264 render(dns_message_t *msg, isc_mem_t *mctx, isc_buffer_t *buf);
265
266 static void
267 xfrin_logv(int level, const char *zonetext, const isc_sockaddr_t *primaryaddr,
268 const char *fmt, va_list ap) ISC_FORMAT_PRINTF(4, 0);
269
270 static void
271 xfrin_log1(int level, const char *zonetext, const isc_sockaddr_t *primaryaddr,
272 const char *fmt, ...) ISC_FORMAT_PRINTF(4, 5);
273
274 static void
275 xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...)
276 ISC_FORMAT_PRINTF(3, 4);
277
278 /**************************************************************************/
279 /*
280 * AXFR handling
281 */
282
283 static isc_result_t
284 axfr_init(dns_xfrin_ctx_t *xfr) {
285 isc_result_t result;
286
287 xfr->is_ixfr = false;
288
289 if (xfr->db != NULL) {
290 dns_db_detach(&xfr->db);
291 }
292
293 CHECK(axfr_makedb(xfr, &xfr->db));
294 dns_rdatacallbacks_init(&xfr->axfr);
295 CHECK(dns_db_beginload(xfr->db, &xfr->axfr));
296 result = ISC_R_SUCCESS;
297 failure:
298 return (result);
299 }
300
301 static isc_result_t
302 axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp) {
303 isc_result_t result;
304
305 result = dns_db_create(xfr->mctx, /* XXX */
306 "rbt", /* XXX guess */
307 &xfr->name, dns_dbtype_zone, xfr->rdclass, 0,
308 NULL, /* XXX guess */
309 dbp);
310 if (result == ISC_R_SUCCESS) {
311 dns_zone_rpz_enable_db(xfr->zone, *dbp);
312 dns_zone_catz_enable_db(xfr->zone, *dbp);
313 }
314 return (result);
315 }
316
317 static isc_result_t
318 axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
319 dns_ttl_t ttl, dns_rdata_t *rdata) {
320 isc_result_t result;
321
322 dns_difftuple_t *tuple = NULL;
323
324 if (rdata->rdclass != xfr->rdclass) {
325 return (DNS_R_BADCLASS);
326 }
327
328 CHECK(dns_zone_checknames(xfr->zone, name, rdata));
329 CHECK(dns_difftuple_create(xfr->diff.mctx, op, name, ttl, rdata,
330 &tuple));
331 dns_diff_append(&xfr->diff, &tuple);
332 if (++xfr->difflen > 100) {
333 CHECK(axfr_apply(xfr));
334 }
335 result = ISC_R_SUCCESS;
336 failure:
337 return (result);
338 }
339
340 /*
341 * Store a set of AXFR RRs in the database.
342 */
343 static isc_result_t
344 axfr_apply(dns_xfrin_ctx_t *xfr) {
345 isc_result_t result;
346 uint64_t records;
347
348 CHECK(dns_diff_load(&xfr->diff, xfr->axfr.add, xfr->axfr.add_private));
349 xfr->difflen = 0;
350 dns_diff_clear(&xfr->diff);
351 if (xfr->maxrecords != 0U) {
352 result = dns_db_getsize(xfr->db, xfr->ver, &records, NULL);
353 if (result == ISC_R_SUCCESS && records > xfr->maxrecords) {
354 result = DNS_R_TOOMANYRECORDS;
355 goto failure;
356 }
357 }
358 result = ISC_R_SUCCESS;
359 failure:
360 return (result);
361 }
362
363 static isc_result_t
364 axfr_commit(dns_xfrin_ctx_t *xfr) {
365 isc_result_t result;
366
367 CHECK(axfr_apply(xfr));
368 CHECK(dns_db_endload(xfr->db, &xfr->axfr));
369 CHECK(dns_zone_verifydb(xfr->zone, xfr->db, NULL));
370
371 result = ISC_R_SUCCESS;
372 failure:
373 return (result);
374 }
375
376 static isc_result_t
377 axfr_finalize(dns_xfrin_ctx_t *xfr) {
378 isc_result_t result;
379
380 CHECK(dns_zone_replacedb(xfr->zone, xfr->db, true));
381
382 result = ISC_R_SUCCESS;
383 failure:
384 return (result);
385 }
386
387 /**************************************************************************/
388 /*
389 * IXFR handling
390 */
391
392 static isc_result_t
393 ixfr_init(dns_xfrin_ctx_t *xfr) {
394 isc_result_t result;
395 char *journalfile = NULL;
396
397 if (xfr->reqtype != dns_rdatatype_ixfr) {
398 xfrin_log(xfr, ISC_LOG_NOTICE,
399 "got incremental response to AXFR request");
400 return (DNS_R_FORMERR);
401 }
402
403 xfr->is_ixfr = true;
404 INSIST(xfr->db != NULL);
405 xfr->difflen = 0;
406
407 journalfile = dns_zone_getjournal(xfr->zone);
408 if (journalfile != NULL) {
409 CHECK(dns_journal_open(xfr->mctx, journalfile,
410 DNS_JOURNAL_CREATE, &xfr->ixfr.journal));
411 }
412
413 result = ISC_R_SUCCESS;
414 failure:
415 return (result);
416 }
417
418 static isc_result_t
419 ixfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
420 dns_ttl_t ttl, dns_rdata_t *rdata) {
421 isc_result_t result;
422 dns_difftuple_t *tuple = NULL;
423
424 if (rdata->rdclass != xfr->rdclass) {
425 return (DNS_R_BADCLASS);
426 }
427
428 if (op == DNS_DIFFOP_ADD) {
429 CHECK(dns_zone_checknames(xfr->zone, name, rdata));
430 }
431 CHECK(dns_difftuple_create(xfr->diff.mctx, op, name, ttl, rdata,
432 &tuple));
433 dns_diff_append(&xfr->diff, &tuple);
434 if (++xfr->difflen > 100) {
435 CHECK(ixfr_apply(xfr));
436 }
437 result = ISC_R_SUCCESS;
438 failure:
439 return (result);
440 }
441
442 /*
443 * Apply a set of IXFR changes to the database.
444 */
445 static isc_result_t
446 ixfr_apply(dns_xfrin_ctx_t *xfr) {
447 isc_result_t result;
448 uint64_t records;
449
450 if (xfr->ver == NULL) {
451 CHECK(dns_db_newversion(xfr->db, &xfr->ver));
452 if (xfr->ixfr.journal != NULL) {
453 CHECK(dns_journal_begin_transaction(xfr->ixfr.journal));
454 }
455 }
456 CHECK(dns_diff_apply(&xfr->diff, xfr->db, xfr->ver));
457 if (xfr->maxrecords != 0U) {
458 result = dns_db_getsize(xfr->db, xfr->ver, &records, NULL);
459 if (result == ISC_R_SUCCESS && records > xfr->maxrecords) {
460 result = DNS_R_TOOMANYRECORDS;
461 goto failure;
462 }
463 }
464 if (xfr->ixfr.journal != NULL) {
465 result = dns_journal_writediff(xfr->ixfr.journal, &xfr->diff);
466 if (result != ISC_R_SUCCESS) {
467 goto failure;
468 }
469 }
470 dns_diff_clear(&xfr->diff);
471 xfr->difflen = 0;
472 result = ISC_R_SUCCESS;
473 failure:
474 return (result);
475 }
476
477 static isc_result_t
478 ixfr_commit(dns_xfrin_ctx_t *xfr) {
479 isc_result_t result;
480
481 CHECK(ixfr_apply(xfr));
482 if (xfr->ver != NULL) {
483 CHECK(dns_zone_verifydb(xfr->zone, xfr->db, xfr->ver));
484 /* XXX enter ready-to-commit state here */
485 if (xfr->ixfr.journal != NULL) {
486 CHECK(dns_journal_commit(xfr->ixfr.journal));
487 }
488 dns_db_closeversion(xfr->db, &xfr->ver, true);
489 dns_zone_markdirty(xfr->zone);
490 }
491 result = ISC_R_SUCCESS;
492 failure:
493 return (result);
494 }
495
496 /**************************************************************************/
497 /*
498 * Common AXFR/IXFR protocol code
499 */
500
501 /*
502 * Handle a single incoming resource record according to the current
503 * state.
504 */
505 static isc_result_t
506 xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, uint32_t ttl,
507 dns_rdata_t *rdata) {
508 isc_result_t result;
509
510 xfr->nrecs++;
511
512 if (rdata->type == dns_rdatatype_none ||
513 dns_rdatatype_ismeta(rdata->type))
514 {
515 char buf[64];
516 dns_rdatatype_format(rdata->type, buf, sizeof(buf));
517 xfrin_log(xfr, ISC_LOG_NOTICE,
518 "Unexpected %s record in zone transfer", buf);
519 FAIL(DNS_R_FORMERR);
520 }
521
522 /*
523 * Immediately reject the entire transfer if the RR that is currently
524 * being processed is an SOA record that is not placed at the zone
525 * apex.
526 */
527 if (rdata->type == dns_rdatatype_soa &&
528 !dns_name_equal(&xfr->name, name))
529 {
530 char namebuf[DNS_NAME_FORMATSIZE];
531 dns_name_format(name, namebuf, sizeof(namebuf));
532 xfrin_log(xfr, ISC_LOG_DEBUG(3), "SOA name mismatch: '%s'",
533 namebuf);
534 FAIL(DNS_R_NOTZONETOP);
535 }
536
537 redo:
538 switch (xfr->state) {
539 case XFRST_SOAQUERY:
540 if (rdata->type != dns_rdatatype_soa) {
541 xfrin_log(xfr, ISC_LOG_NOTICE,
542 "non-SOA response to SOA query");
543 FAIL(DNS_R_FORMERR);
544 }
545 xfr->end_serial = dns_soa_getserial(rdata);
546 if (!DNS_SERIAL_GT(xfr->end_serial, xfr->ixfr.request_serial) &&
547 !dns_zone_isforced(xfr->zone))
548 {
549 xfrin_log(xfr, ISC_LOG_DEBUG(3),
550 "requested serial %u, "
551 "primary has %u, not updating",
552 xfr->ixfr.request_serial, xfr->end_serial);
553 FAIL(DNS_R_UPTODATE);
554 }
555 xfr->state = XFRST_GOTSOA;
556 break;
557
558 case XFRST_GOTSOA:
559 /*
560 * Skip other records in the answer section.
561 */
562 break;
563
564 case XFRST_INITIALSOA:
565 if (rdata->type != dns_rdatatype_soa) {
566 xfrin_log(xfr, ISC_LOG_NOTICE,
567 "first RR in zone transfer must be SOA");
568 FAIL(DNS_R_FORMERR);
569 }
570 /*
571 * Remember the serial number in the initial SOA.
572 * We need it to recognize the end of an IXFR.
573 */
574 xfr->end_serial = dns_soa_getserial(rdata);
575 if (xfr->reqtype == dns_rdatatype_ixfr &&
576 !DNS_SERIAL_GT(xfr->end_serial, xfr->ixfr.request_serial) &&
577 !dns_zone_isforced(xfr->zone))
578 {
579 /*
580 * This must be the single SOA record that is
581 * sent when the current version on the primary
582 * is not newer than the version in the request.
583 */
584 xfrin_log(xfr, ISC_LOG_DEBUG(3),
585 "requested serial %u, "
586 "primary has %u, not updating",
587 xfr->ixfr.request_serial, xfr->end_serial);
588 FAIL(DNS_R_UPTODATE);
589 }
590 xfr->firstsoa = *rdata;
591 if (xfr->firstsoa_data != NULL) {
592 isc_mem_free(xfr->mctx, xfr->firstsoa_data);
593 }
594 xfr->firstsoa_data = isc_mem_allocate(xfr->mctx, rdata->length);
595 memcpy(xfr->firstsoa_data, rdata->data, rdata->length);
596 xfr->firstsoa.data = xfr->firstsoa_data;
597 xfr->state = XFRST_FIRSTDATA;
598 break;
599
600 case XFRST_FIRSTDATA:
601 /*
602 * If the transfer begins with one SOA record, it is an AXFR,
603 * if it begins with two SOAs, it is an IXFR.
604 */
605 if (xfr->reqtype == dns_rdatatype_ixfr &&
606 rdata->type == dns_rdatatype_soa &&
607 xfr->ixfr.request_serial == dns_soa_getserial(rdata))
608 {
609 xfrin_log(xfr, ISC_LOG_DEBUG(3),
610 "got incremental response");
611 CHECK(ixfr_init(xfr));
612 xfr->state = XFRST_IXFR_DELSOA;
613 } else {
614 xfrin_log(xfr, ISC_LOG_DEBUG(3),
615 "got nonincremental response");
616 CHECK(axfr_init(xfr));
617 xfr->state = XFRST_AXFR;
618 }
619 goto redo;
620
621 case XFRST_IXFR_DELSOA:
622 INSIST(rdata->type == dns_rdatatype_soa);
623 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_DEL, name, ttl, rdata));
624 xfr->state = XFRST_IXFR_DEL;
625 break;
626
627 case XFRST_IXFR_DEL:
628 if (rdata->type == dns_rdatatype_soa) {
629 uint32_t soa_serial = dns_soa_getserial(rdata);
630 xfr->state = XFRST_IXFR_ADDSOA;
631 xfr->ixfr.current_serial = soa_serial;
632 goto redo;
633 }
634 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_DEL, name, ttl, rdata));
635 break;
636
637 case XFRST_IXFR_ADDSOA:
638 INSIST(rdata->type == dns_rdatatype_soa);
639 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
640 xfr->state = XFRST_IXFR_ADD;
641 break;
642
643 case XFRST_IXFR_ADD:
644 if (rdata->type == dns_rdatatype_soa) {
645 uint32_t soa_serial = dns_soa_getserial(rdata);
646 if (soa_serial == xfr->end_serial) {
647 CHECK(ixfr_commit(xfr));
648 xfr->state = XFRST_IXFR_END;
649 break;
650 } else if (soa_serial != xfr->ixfr.current_serial) {
651 xfrin_log(xfr, ISC_LOG_NOTICE,
652 "IXFR out of sync: "
653 "expected serial %u, got %u",
654 xfr->ixfr.current_serial, soa_serial);
655 FAIL(DNS_R_FORMERR);
656 } else {
657 CHECK(ixfr_commit(xfr));
658 xfr->state = XFRST_IXFR_DELSOA;
659 goto redo;
660 }
661 }
662 if (rdata->type == dns_rdatatype_ns &&
663 dns_name_iswildcard(name))
664 {
665 FAIL(DNS_R_INVALIDNS);
666 }
667 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
668 break;
669
670 case XFRST_AXFR:
671 /*
672 * Old BINDs sent cross class A records for non IN classes.
673 */
674 if (rdata->type == dns_rdatatype_a &&
675 rdata->rdclass != xfr->rdclass &&
676 xfr->rdclass != dns_rdataclass_in)
677 {
678 break;
679 }
680 CHECK(axfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
681 if (rdata->type == dns_rdatatype_soa) {
682 /*
683 * Use dns_rdata_compare instead of memcmp to
684 * allow for case differences.
685 */
686 if (dns_rdata_compare(rdata, &xfr->firstsoa) != 0) {
687 xfrin_log(xfr, ISC_LOG_NOTICE,
688 "start and ending SOA records "
689 "mismatch");
690 FAIL(DNS_R_FORMERR);
691 }
692 CHECK(axfr_commit(xfr));
693 xfr->state = XFRST_AXFR_END;
694 break;
695 }
696 break;
697 case XFRST_AXFR_END:
698 case XFRST_IXFR_END:
699 FAIL(DNS_R_EXTRADATA);
700 FALLTHROUGH;
701 default:
702 UNREACHABLE();
703 }
704 result = ISC_R_SUCCESS;
705 failure:
706 return (result);
707 }
708
709 isc_result_t
710 dns_xfrin_create(dns_zone_t *zone, dns_rdatatype_t xfrtype,
711 const isc_sockaddr_t *primaryaddr,
712 const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
713 dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
714 isc_mem_t *mctx, isc_nm_t *netmgr, dns_xfrindone_t done,
715 dns_xfrin_ctx_t **xfrp) {
716 dns_name_t *zonename = dns_zone_getorigin(zone);
717 dns_xfrin_ctx_t *xfr = NULL;
718 isc_result_t result;
719 dns_db_t *db = NULL;
720
721 REQUIRE(xfrp != NULL && *xfrp == NULL);
722 REQUIRE(done != NULL);
723 REQUIRE(isc_sockaddr_getport(primaryaddr) != 0);
724
725 (void)dns_zone_getdb(zone, &db);
726
727 if (xfrtype == dns_rdatatype_soa || xfrtype == dns_rdatatype_ixfr) {
728 REQUIRE(db != NULL);
729 }
730
731 xfrin_create(mctx, zone, db, netmgr, zonename, dns_zone_getclass(zone),
732 xfrtype, primaryaddr, sourceaddr, tsigkey, transport,
733 tlsctx_cache, &xfr);
734
735 if (db != NULL) {
736 xfr->zone_had_db = true;
737 }
738
739 xfr->done = done;
740
741 isc_refcount_init(&xfr->references, 1);
742
743 /*
744 * Set *xfrp now, before calling xfrin_start(). Asynchronous
745 * netmgr processing could cause the 'done' callback to run in
746 * another thread before we reached the end of the present
747 * function. In that case, if *xfrp hadn't already been
748 * attached, the 'done' function would be unable to detach it.
749 */
750 *xfrp = xfr;
751
752 result = xfrin_start(xfr);
753 if (result != ISC_R_SUCCESS) {
754 atomic_store(&xfr->shuttingdown, true);
755 xfr->shutdown_result = result;
756 dns_xfrin_detach(xfrp);
757 }
758
759 if (db != NULL) {
760 dns_db_detach(&db);
761 }
762
763 if (result != ISC_R_SUCCESS) {
764 char zonetext[DNS_NAME_MAXTEXT + 32];
765 dns_zone_name(zone, zonetext, sizeof(zonetext));
766 xfrin_log1(ISC_LOG_ERROR, zonetext, primaryaddr,
767 "zone transfer setup failed");
768 }
769
770 return (result);
771 }
772
773 static void
774 xfrin_cancelio(dns_xfrin_ctx_t *xfr);
775
776 static void
777 xfrin_timedout(struct isc_task *task, struct isc_event *event) {
778 UNUSED(task);
779
780 dns_xfrin_ctx_t *xfr = event->ev_arg;
781 REQUIRE(VALID_XFRIN(xfr));
782
783 xfrin_fail(xfr, ISC_R_TIMEDOUT, "maximum transfer time exceeded");
784 isc_event_free(&event);
785 }
786
787 static void
788 xfrin_idledout(struct isc_task *task, struct isc_event *event) {
789 UNUSED(task);
790
791 dns_xfrin_ctx_t *xfr = event->ev_arg;
792 REQUIRE(VALID_XFRIN(xfr));
793
794 xfrin_fail(xfr, ISC_R_TIMEDOUT, "maximum idle time exceeded");
795 isc_event_free(&event);
796 }
797
798 void
799 dns_xfrin_shutdown(dns_xfrin_ctx_t *xfr) {
800 REQUIRE(VALID_XFRIN(xfr));
801
802 xfrin_fail(xfr, ISC_R_CANCELED, "shut down");
803 }
804
805 void
806 dns_xfrin_attach(dns_xfrin_ctx_t *source, dns_xfrin_ctx_t **target) {
807 REQUIRE(VALID_XFRIN(source));
808 REQUIRE(target != NULL && *target == NULL);
809 (void)isc_refcount_increment(&source->references);
810
811 *target = source;
812 }
813
814 void
815 dns_xfrin_detach(dns_xfrin_ctx_t **xfrp) {
816 dns_xfrin_ctx_t *xfr = NULL;
817
818 REQUIRE(xfrp != NULL && VALID_XFRIN(*xfrp));
819
820 xfr = *xfrp;
821 *xfrp = NULL;
822
823 if (isc_refcount_decrement(&xfr->references) == 1) {
824 xfrin_destroy(xfr);
825 }
826 }
827
828 static void
829 xfrin_cancelio(dns_xfrin_ctx_t *xfr) {
830 if (xfr->readhandle == NULL) {
831 return;
832 }
833
834 isc_nm_cancelread(xfr->readhandle);
835 /* The xfr->readhandle detach will happen in xfrin_recv_done callback */
836 }
837
838 static void
839 xfrin_reset(dns_xfrin_ctx_t *xfr) {
840 REQUIRE(VALID_XFRIN(xfr));
841
842 xfrin_log(xfr, ISC_LOG_INFO, "resetting");
843
844 REQUIRE(xfr->readhandle == NULL);
845 REQUIRE(xfr->sendhandle == NULL);
846
847 if (xfr->lasttsig != NULL) {
848 isc_buffer_free(&xfr->lasttsig);
849 }
850
851 dns_diff_clear(&xfr->diff);
852 xfr->difflen = 0;
853
854 if (xfr->ixfr.journal != NULL) {
855 dns_journal_destroy(&xfr->ixfr.journal);
856 }
857
858 if (xfr->axfr.add_private != NULL) {
859 (void)dns_db_endload(xfr->db, &xfr->axfr);
860 }
861
862 if (xfr->ver != NULL) {
863 dns_db_closeversion(xfr->db, &xfr->ver, false);
864 }
865 }
866
867 static void
868 xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg) {
869 /* Make sure only the first xfrin_fail() trumps */
870 if (atomic_compare_exchange_strong(&xfr->shuttingdown, &(bool){ false },
871 true))
872 {
873 (void)isc_timer_reset(xfr->max_time_timer,
874 isc_timertype_inactive, NULL, NULL, true);
875 (void)isc_timer_reset(xfr->max_idle_timer,
876 isc_timertype_inactive, NULL, NULL, true);
877
878 if (result != DNS_R_UPTODATE && result != DNS_R_TOOMANYRECORDS)
879 {
880 xfrin_log(xfr, ISC_LOG_ERROR, "%s: %s", msg,
881 isc_result_totext(result));
882 if (xfr->is_ixfr) {
883 /* Pass special result code to force AXFR retry
884 */
885 result = DNS_R_BADIXFR;
886 }
887 }
888 xfrin_cancelio(xfr);
889 /*
890 * Close the journal.
891 */
892 if (xfr->ixfr.journal != NULL) {
893 dns_journal_destroy(&xfr->ixfr.journal);
894 }
895 if (xfr->done != NULL) {
896 (xfr->done)(xfr->zone, result);
897 xfr->done = NULL;
898 }
899 xfr->shutdown_result = result;
900 }
901 }
902
903 static void
904 xfrin_create(isc_mem_t *mctx, dns_zone_t *zone, dns_db_t *db, isc_nm_t *netmgr,
905 dns_name_t *zonename, dns_rdataclass_t rdclass,
906 dns_rdatatype_t reqtype, const isc_sockaddr_t *primaryaddr,
907 const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
908 dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
909 dns_xfrin_ctx_t **xfrp) {
910 dns_xfrin_ctx_t *xfr = NULL;
911 dns_zonemgr_t *zmgr = dns_zone_getmgr(zone);
912 isc_timermgr_t *timermgr = dns_zonemgr_gettimermgr(zmgr);
913 isc_task_t *ztask = NULL;
914
915 xfr = isc_mem_get(mctx, sizeof(*xfr));
916 *xfr = (dns_xfrin_ctx_t){ .netmgr = netmgr,
917 .shutdown_result = ISC_R_UNSET,
918 .rdclass = rdclass,
919 .reqtype = reqtype,
920 .id = (dns_messageid_t)isc_random16(),
921 .maxrecords = dns_zone_getmaxrecords(zone),
922 .primaryaddr = *primaryaddr,
923 .sourceaddr = *sourceaddr,
924 .firstsoa = DNS_RDATA_INIT,
925 .magic = XFRIN_MAGIC };
926
927 isc_mem_attach(mctx, &xfr->mctx);
928 dns_zone_iattach(zone, &xfr->zone);
929 dns_name_init(&xfr->name, NULL);
930
931 isc_refcount_init(&xfr->connects, 0);
932 isc_refcount_init(&xfr->sends, 0);
933 isc_refcount_init(&xfr->recvs, 0);
934
935 atomic_init(&xfr->shuttingdown, false);
936
937 if (db != NULL) {
938 dns_db_attach(db, &xfr->db);
939 }
940
941 dns_diff_init(xfr->mctx, &xfr->diff);
942
943 if (reqtype == dns_rdatatype_soa) {
944 xfr->state = XFRST_SOAQUERY;
945 } else {
946 xfr->state = XFRST_INITIALSOA;
947 }
948
949 isc_time_now(&xfr->start);
950
951 if (tsigkey != NULL) {
952 dns_tsigkey_attach(tsigkey, &xfr->tsigkey);
953 }
954
955 if (transport != NULL) {
956 dns_transport_attach(transport, &xfr->transport);
957 }
958
959 dns_name_dup(zonename, mctx, &xfr->name);
960
961 INSIST(isc_sockaddr_pf(primaryaddr) == isc_sockaddr_pf(sourceaddr));
962 isc_sockaddr_setport(&xfr->sourceaddr, 0);
963
964 /*
965 * Reserve 2 bytes for TCP length at the beginning of the buffer.
966 */
967 isc_buffer_init(&xfr->qbuffer, &xfr->qbuffer_data[2],
968 sizeof(xfr->qbuffer_data) - 2);
969
970 isc_tlsctx_cache_attach(tlsctx_cache, &xfr->tlsctx_cache);
971
972 dns_zone_gettask(zone, &ztask);
973 isc_timer_create(timermgr, isc_timertype_inactive, NULL, NULL, ztask,
974 xfrin_timedout, xfr, &xfr->max_time_timer);
975 isc_timer_create(timermgr, isc_timertype_inactive, NULL, NULL, ztask,
976 xfrin_idledout, xfr, &xfr->max_idle_timer);
977 isc_task_detach(&ztask); /* dns_zone_task() attaches to the task */
978
979 *xfrp = xfr;
980 }
981
982 static isc_result_t
983 get_create_tlsctx(const dns_xfrin_ctx_t *xfr, isc_tlsctx_t **pctx,
984 isc_tlsctx_client_session_cache_t **psess_cache) {
985 isc_result_t result = ISC_R_FAILURE;
986 isc_tlsctx_t *tlsctx = NULL, *found = NULL;
987 isc_tls_cert_store_t *store = NULL, *found_store = NULL;
988 isc_tlsctx_client_session_cache_t *sess_cache = NULL,
989 *found_sess_cache = NULL;
990 uint32_t tls_versions;
991 const char *ciphers = NULL;
992 bool prefer_server_ciphers;
993 const uint16_t family = isc_sockaddr_pf(&xfr->primaryaddr) == PF_INET6
994 ? AF_INET6
995 : AF_INET;
996 const char *tlsname = NULL;
997
998 REQUIRE(psess_cache != NULL && *psess_cache == NULL);
999 REQUIRE(pctx != NULL && *pctx == NULL);
1000
1001 INSIST(xfr->transport != NULL);
1002 tlsname = dns_transport_get_tlsname(xfr->transport);
1003 INSIST(tlsname != NULL && *tlsname != '\0');
1004
1005 /*
1006 * Let's try to re-use the already created context. This way
1007 * we have a chance to resume the TLS session, bypassing the
1008 * full TLS handshake procedure, making establishing
1009 * subsequent TLS connections for XoT faster.
1010 */
1011 result = isc_tlsctx_cache_find(xfr->tlsctx_cache, tlsname,
1012 isc_tlsctx_cache_tls, family, &found,
1013 &found_store, &found_sess_cache);
1014 if (result != ISC_R_SUCCESS) {
1015 const char *hostname =
1016 dns_transport_get_remote_hostname(xfr->transport);
1017 const char *ca_file = dns_transport_get_cafile(xfr->transport);
1018 const char *cert_file =
1019 dns_transport_get_certfile(xfr->transport);
1020 const char *key_file =
1021 dns_transport_get_keyfile(xfr->transport);
1022 char primary_addr_str[INET6_ADDRSTRLEN] = { 0 };
1023 isc_netaddr_t primary_netaddr = { 0 };
1024 bool hostname_ignore_subject;
1025 /*
1026 * So, no context exists. Let's create one using the
1027 * parameters from the configuration file and try to
1028 * store it for further reuse.
1029 */
1030 result = isc_tlsctx_createclient(&tlsctx);
1031 if (result != ISC_R_SUCCESS) {
1032 goto failure;
1033 }
1034 tls_versions = dns_transport_get_tls_versions(xfr->transport);
1035 if (tls_versions != 0) {
1036 isc_tlsctx_set_protocols(tlsctx, tls_versions);
1037 }
1038 ciphers = dns_transport_get_ciphers(xfr->transport);
1039 if (ciphers != NULL) {
1040 isc_tlsctx_set_cipherlist(tlsctx, ciphers);
1041 }
1042
1043 if (dns_transport_get_prefer_server_ciphers(
1044 xfr->transport, &prefer_server_ciphers))
1045 {
1046 isc_tlsctx_prefer_server_ciphers(tlsctx,
1047 prefer_server_ciphers);
1048 }
1049
1050 if (hostname != NULL || ca_file != NULL) {
1051 /*
1052 * The situation when 'found_store != NULL' while 'found
1053 * == NULL' might appear as there is one to many
1054 * relation between per transport TLS contexts and cert
1055 * stores. That is, there could be one store shared
1056 * between multiple contexts.
1057 */
1058 if (found_store == NULL) {
1059 /*
1060 * 'ca_file' can equal 'NULL' here, in
1061 * that case the store with system-wide
1062 * CA certificates will be created, just
1063 * as planned.
1064 */
1065 result = isc_tls_cert_store_create(ca_file,
1066 &store);
1067
1068 if (result != ISC_R_SUCCESS) {
1069 goto failure;
1070 }
1071 } else {
1072 store = found_store;
1073 }
1074
1075 INSIST(store != NULL);
1076 if (hostname == NULL) {
1077 /*
1078 * If CA bundle file is specified, but
1079 * hostname is not, then use the primary
1080 * IP address for validation, just like
1081 * dig does.
1082 */
1083 INSIST(ca_file != NULL);
1084 isc_netaddr_fromsockaddr(&primary_netaddr,
1085 &xfr->primaryaddr);
1086 isc_netaddr_format(&primary_netaddr,
1087 primary_addr_str,
1088 sizeof(primary_addr_str));
1089 hostname = primary_addr_str;
1090 }
1091 /*
1092 * According to RFC 8310, Subject field MUST NOT
1093 * be inspected when verifying hostname for DoT.
1094 * Only SubjectAltName must be checked.
1095 */
1096 hostname_ignore_subject = true;
1097 result = isc_tlsctx_enable_peer_verification(
1098 tlsctx, false, store, hostname,
1099 hostname_ignore_subject);
1100 if (result != ISC_R_SUCCESS) {
1101 goto failure;
1102 }
1103
1104 /*
1105 * Let's load client certificate and enable
1106 * Mutual TLS. We do that only in the case when
1107 * Strict TLS is enabled, because Mutual TLS is
1108 * an extension of it.
1109 */
1110 if (cert_file != NULL) {
1111 INSIST(key_file != NULL);
1112
1113 result = isc_tlsctx_load_certificate(
1114 tlsctx, key_file, cert_file);
1115 if (result != ISC_R_SUCCESS) {
1116 goto failure;
1117 }
1118 }
1119 }
1120
1121 isc_tlsctx_enable_dot_client_alpn(tlsctx);
1122
1123 isc_tlsctx_client_session_cache_create(
1124 xfr->mctx, tlsctx,
1125 ISC_TLSCTX_CLIENT_SESSION_CACHE_DEFAULT_SIZE,
1126 &sess_cache);
1127
1128 found_store = NULL;
1129 result = isc_tlsctx_cache_add(xfr->tlsctx_cache, tlsname,
1130 isc_tlsctx_cache_tls, family,
1131 tlsctx, store, sess_cache, &found,
1132 &found_store, &found_sess_cache);
1133 if (result == ISC_R_EXISTS) {
1134 /*
1135 * It seems the entry has just been created from within
1136 * another thread while we were initialising
1137 * ours. Although this is unlikely, it could happen
1138 * after startup/re-initialisation. In such a case,
1139 * discard the new context and associated data and use
1140 * the already established one from now on.
1141 *
1142 * Such situation will not occur after the
1143 * initial 'warm-up', so it is not critical
1144 * performance-wise.
1145 */
1146 INSIST(found != NULL);
1147 isc_tlsctx_free(&tlsctx);
1148 /*
1149 * The 'store' variable can be 'NULL' when remote server
1150 * verification is not enabled (that is, when Strict or
1151 * Mutual TLS are not used).
1152 *
1153 * The 'found_store' might be equal to 'store' as there
1154 * is one-to-many relation between a store and
1155 * per-transport TLS contexts. In that case, the call to
1156 * 'isc_tlsctx_cache_find()' above could have returned a
1157 * store via the 'found_store' variable, whose value we
1158 * can assign to 'store' later. In that case,
1159 * 'isc_tlsctx_cache_add()' will return the same value.
1160 * When that happens, we should not free the store
1161 * object, as it is managed by the TLS context cache.
1162 */
1163 if (store != NULL && store != found_store) {
1164 isc_tls_cert_store_free(&store);
1165 }
1166 isc_tlsctx_client_session_cache_detach(&sess_cache);
1167 /* Let's return the data from the cache. */
1168 *psess_cache = found_sess_cache;
1169 *pctx = found;
1170 } else {
1171 /*
1172 * Adding the fresh values into the cache has been
1173 * successful, let's return them
1174 */
1175 INSIST(result == ISC_R_SUCCESS);
1176 *psess_cache = sess_cache;
1177 *pctx = tlsctx;
1178 }
1179 } else {
1180 /*
1181 * The cache lookup has been successful, let's return the
1182 * results.
1183 */
1184 INSIST(result == ISC_R_SUCCESS);
1185 *psess_cache = found_sess_cache;
1186 *pctx = found;
1187 }
1188
1189 return (ISC_R_SUCCESS);
1190
1191 failure:
1192 if (tlsctx != NULL) {
1193 isc_tlsctx_free(&tlsctx);
1194 }
1195
1196 /*
1197 * The 'found_store' is being managed by the TLS context
1198 * cache. Thus, we should keep it as it is, as it will get
1199 * destroyed alongside the cache. As there is one store per
1200 * multiple TLS contexts, we need to handle store deletion in a
1201 * special way.
1202 */
1203 if (store != NULL && store != found_store) {
1204 isc_tls_cert_store_free(&store);
1205 }
1206
1207 return (result);
1208 }
1209
1210 static isc_result_t
1211 xfrin_start(dns_xfrin_ctx_t *xfr) {
1212 isc_result_t result;
1213 dns_xfrin_ctx_t *connect_xfr = NULL;
1214 dns_transport_type_t transport_type = DNS_TRANSPORT_TCP;
1215 isc_tlsctx_t *tlsctx = NULL;
1216 isc_tlsctx_client_session_cache_t *sess_cache = NULL;
1217 isc_interval_t interval;
1218 isc_time_t next;
1219
1220 (void)isc_refcount_increment0(&xfr->connects);
1221 dns_xfrin_attach(xfr, &connect_xfr);
1222
1223 if (xfr->transport != NULL) {
1224 transport_type = dns_transport_get_type(xfr->transport);
1225 }
1226
1227 /* Set the maximum timer */
1228 isc_interval_set(&interval, dns_zone_getmaxxfrin(xfr->zone), 0);
1229 isc_time_nowplusinterval(&next, &interval);
1230 result = isc_timer_reset(xfr->max_time_timer, isc_timertype_once, &next,
1231 NULL, true);
1232 RUNTIME_CHECK(result == ISC_R_SUCCESS);
1233
1234 /* Set the idle timer */
1235 isc_interval_set(&interval, dns_zone_getidlein(xfr->zone), 0);
1236 isc_time_nowplusinterval(&next, &interval);
1237 result = isc_timer_reset(xfr->max_idle_timer, isc_timertype_once, &next,
1238 NULL, true);
1239 RUNTIME_CHECK(result == ISC_R_SUCCESS);
1240
1241 /*
1242 * XXX: timeouts are hard-coded to 30 seconds; this needs to be
1243 * configurable.
1244 */
1245 switch (transport_type) {
1246 case DNS_TRANSPORT_TCP:
1247 isc_nm_tcpdnsconnect(xfr->netmgr, &xfr->sourceaddr,
1248 &xfr->primaryaddr, xfrin_connect_done,
1249 connect_xfr, 30000, 0);
1250 break;
1251 case DNS_TRANSPORT_TLS: {
1252 result = get_create_tlsctx(xfr, &tlsctx, &sess_cache);
1253 if (result != ISC_R_SUCCESS) {
1254 goto failure;
1255 }
1256 INSIST(tlsctx != NULL);
1257 isc_nm_tlsdnsconnect(xfr->netmgr, &xfr->sourceaddr,
1258 &xfr->primaryaddr, xfrin_connect_done,
1259 connect_xfr, 30000, 0, tlsctx, sess_cache);
1260 } break;
1261 default:
1262 UNREACHABLE();
1263 }
1264
1265 return (ISC_R_SUCCESS);
1266
1267 failure:
1268 isc_refcount_decrement0(&xfr->connects);
1269 dns_xfrin_detach(&connect_xfr);
1270 return (result);
1271 }
1272
1273 /* XXX the resolver could use this, too */
1274
1275 static isc_result_t
1276 render(dns_message_t *msg, isc_mem_t *mctx, isc_buffer_t *buf) {
1277 dns_compress_t cctx;
1278 bool cleanup_cctx = false;
1279 isc_result_t result;
1280
1281 CHECK(dns_compress_init(&cctx, -1, mctx));
1282 cleanup_cctx = true;
1283 CHECK(dns_message_renderbegin(msg, &cctx, buf));
1284 CHECK(dns_message_rendersection(msg, DNS_SECTION_QUESTION, 0));
1285 CHECK(dns_message_rendersection(msg, DNS_SECTION_ANSWER, 0));
1286 CHECK(dns_message_rendersection(msg, DNS_SECTION_AUTHORITY, 0));
1287 CHECK(dns_message_rendersection(msg, DNS_SECTION_ADDITIONAL, 0));
1288 CHECK(dns_message_renderend(msg));
1289 result = ISC_R_SUCCESS;
1290 failure:
1291 if (cleanup_cctx) {
1292 dns_compress_invalidate(&cctx);
1293 }
1294 return (result);
1295 }
1296
1297 /*
1298 * A connection has been established.
1299 */
1300 static void
1301 xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
1302 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)cbarg;
1303 char sourcetext[ISC_SOCKADDR_FORMATSIZE];
1304 char signerbuf[DNS_NAME_FORMATSIZE];
1305 const char *signer = "", *sep = "";
1306 isc_sockaddr_t sockaddr;
1307 dns_zonemgr_t *zmgr = NULL;
1308
1309 REQUIRE(VALID_XFRIN(xfr));
1310
1311 isc_refcount_decrement0(&xfr->connects);
1312
1313 if (atomic_load(&xfr->shuttingdown)) {
1314 result = ISC_R_SHUTTINGDOWN;
1315 }
1316
1317 if (result != ISC_R_SUCCESS) {
1318 xfrin_fail(xfr, result, "failed to connect");
1319 goto failure;
1320 }
1321
1322 result = isc_nm_xfr_checkperm(handle);
1323 if (result != ISC_R_SUCCESS) {
1324 xfrin_fail(xfr, result, "connected but unable to transfer");
1325 goto failure;
1326 }
1327
1328 zmgr = dns_zone_getmgr(xfr->zone);
1329 if (zmgr != NULL) {
1330 dns_zonemgr_unreachabledel(zmgr, &xfr->primaryaddr,
1331 &xfr->sourceaddr);
1332 }
1333
1334 xfr->handle = handle;
1335 sockaddr = isc_nmhandle_peeraddr(handle);
1336 isc_sockaddr_format(&sockaddr, sourcetext, sizeof(sourcetext));
1337
1338 if (xfr->tsigkey != NULL && xfr->tsigkey->key != NULL) {
1339 dns_name_format(dst_key_name(xfr->tsigkey->key), signerbuf,
1340 sizeof(signerbuf));
1341 sep = " TSIG ";
1342 signer = signerbuf;
1343 }
1344
1345 xfrin_log(xfr, ISC_LOG_INFO, "connected using %s%s%s", sourcetext, sep,
1346 signer);
1347
1348 result = xfrin_send_request(xfr);
1349 if (result != ISC_R_SUCCESS) {
1350 xfrin_fail(xfr, result, "connected but unable to send");
1351 }
1352
1353 failure:
1354 switch (result) {
1355 case ISC_R_SUCCESS:
1356 break;
1357 case ISC_R_NETDOWN:
1358 case ISC_R_HOSTDOWN:
1359 case ISC_R_NETUNREACH:
1360 case ISC_R_HOSTUNREACH:
1361 case ISC_R_CONNREFUSED:
1362 case ISC_R_TIMEDOUT:
1363 /*
1364 * Add the server to unreachable primaries table if
1365 * the server has a permanent networking error or
1366 * the connection attempt as timed out.
1367 */
1368 zmgr = dns_zone_getmgr(xfr->zone);
1369 if (zmgr != NULL) {
1370 isc_time_t now;
1371
1372 TIME_NOW(&now);
1373
1374 dns_zonemgr_unreachableadd(zmgr, &xfr->primaryaddr,
1375 &xfr->sourceaddr, &now);
1376 }
1377 break;
1378 default:
1379 /* Retry sooner than in 10 minutes */
1380 break;
1381 }
1382
1383 dns_xfrin_detach(&xfr);
1384 }
1385
1386 /*
1387 * Convert a tuple into a dns_name_t suitable for inserting
1388 * into the given dns_message_t.
1389 */
1390 static isc_result_t
1391 tuple2msgname(dns_difftuple_t *tuple, dns_message_t *msg, dns_name_t **target) {
1392 isc_result_t result;
1393 dns_rdata_t *rdata = NULL;
1394 dns_rdatalist_t *rdl = NULL;
1395 dns_rdataset_t *rds = NULL;
1396 dns_name_t *name = NULL;
1397
1398 REQUIRE(target != NULL && *target == NULL);
1399
1400 CHECK(dns_message_gettemprdata(msg, &rdata));
1401 dns_rdata_init(rdata);
1402 dns_rdata_clone(&tuple->rdata, rdata);
1403
1404 CHECK(dns_message_gettemprdatalist(msg, &rdl));
1405 dns_rdatalist_init(rdl);
1406 rdl->type = tuple->rdata.type;
1407 rdl->rdclass = tuple->rdata.rdclass;
1408 rdl->ttl = tuple->ttl;
1409 ISC_LIST_APPEND(rdl->rdata, rdata, link);
1410
1411 CHECK(dns_message_gettemprdataset(msg, &rds));
1412 CHECK(dns_rdatalist_tordataset(rdl, rds));
1413
1414 CHECK(dns_message_gettempname(msg, &name));
1415 dns_name_clone(&tuple->name, name);
1416 ISC_LIST_APPEND(name->list, rds, link);
1417
1418 *target = name;
1419 return (ISC_R_SUCCESS);
1420
1421 failure:
1422
1423 if (rds != NULL) {
1424 dns_rdataset_disassociate(rds);
1425 dns_message_puttemprdataset(msg, &rds);
1426 }
1427 if (rdl != NULL) {
1428 ISC_LIST_UNLINK(rdl->rdata, rdata, link);
1429 dns_message_puttemprdatalist(msg, &rdl);
1430 }
1431 if (rdata != NULL) {
1432 dns_message_puttemprdata(msg, &rdata);
1433 }
1434
1435 return (result);
1436 }
1437
1438 /*
1439 * Build an *XFR request and send its length prefix.
1440 */
1441 static isc_result_t
1442 xfrin_send_request(dns_xfrin_ctx_t *xfr) {
1443 isc_result_t result;
1444 isc_region_t region;
1445 dns_rdataset_t *qrdataset = NULL;
1446 dns_message_t *msg = NULL;
1447 dns_difftuple_t *soatuple = NULL;
1448 dns_name_t *qname = NULL;
1449 dns_dbversion_t *ver = NULL;
1450 dns_name_t *msgsoaname = NULL;
1451 dns_xfrin_ctx_t *send_xfr = NULL;
1452
1453 /* Create the request message */
1454 dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTRENDER, &msg);
1455 CHECK(dns_message_settsigkey(msg, xfr->tsigkey));
1456
1457 /* Create a name for the question section. */
1458 CHECK(dns_message_gettempname(msg, &qname));
1459 dns_name_clone(&xfr->name, qname);
1460
1461 /* Formulate the question and attach it to the question name. */
1462 CHECK(dns_message_gettemprdataset(msg, &qrdataset));
1463 dns_rdataset_makequestion(qrdataset, xfr->rdclass, xfr->reqtype);
1464 ISC_LIST_APPEND(qname->list, qrdataset, link);
1465 qrdataset = NULL;
1466
1467 dns_message_addname(msg, qname, DNS_SECTION_QUESTION);
1468 qname = NULL;
1469
1470 if (xfr->reqtype == dns_rdatatype_ixfr) {
1471 /* Get the SOA and add it to the authority section. */
1472 /* XXX is using the current version the right thing? */
1473 dns_db_currentversion(xfr->db, &ver);
1474 CHECK(dns_db_createsoatuple(xfr->db, ver, xfr->mctx,
1475 DNS_DIFFOP_EXISTS, &soatuple));
1476 xfr->ixfr.request_serial = dns_soa_getserial(&soatuple->rdata);
1477 xfr->ixfr.current_serial = xfr->ixfr.request_serial;
1478 xfrin_log(xfr, ISC_LOG_DEBUG(3),
1479 "requesting IXFR for serial %u",
1480 xfr->ixfr.request_serial);
1481
1482 CHECK(tuple2msgname(soatuple, msg, &msgsoaname));
1483 dns_message_addname(msg, msgsoaname, DNS_SECTION_AUTHORITY);
1484 } else if (xfr->reqtype == dns_rdatatype_soa) {
1485 CHECK(dns_db_getsoaserial(xfr->db, NULL,
1486 &xfr->ixfr.request_serial));
1487 }
1488
1489 xfr->id++;
1490 xfr->nmsg = 0;
1491 xfr->nrecs = 0;
1492 xfr->nbytes = 0;
1493 isc_time_now(&xfr->start);
1494 msg->id = xfr->id;
1495 if (xfr->tsigctx != NULL) {
1496 dst_context_destroy(&xfr->tsigctx);
1497 }
1498
1499 CHECK(render(msg, xfr->mctx, &xfr->qbuffer));
1500
1501 /*
1502 * Free the last tsig, if there is one.
1503 */
1504 if (xfr->lasttsig != NULL) {
1505 isc_buffer_free(&xfr->lasttsig);
1506 }
1507
1508 /*
1509 * Save the query TSIG and don't let message_destroy free it.
1510 */
1511 CHECK(dns_message_getquerytsig(msg, xfr->mctx, &xfr->lasttsig));
1512
1513 isc_buffer_usedregion(&xfr->qbuffer, ®ion);
1514 INSIST(region.length <= 65535);
1515
1516 dns_xfrin_attach(xfr, &send_xfr);
1517 isc_nmhandle_attach(send_xfr->handle, &xfr->sendhandle);
1518 isc_refcount_increment0(&send_xfr->sends);
1519 isc_nm_send(xfr->handle, ®ion, xfrin_send_done, send_xfr);
1520
1521 failure:
1522 if (qname != NULL) {
1523 dns_message_puttempname(msg, &qname);
1524 }
1525 if (qrdataset != NULL) {
1526 dns_message_puttemprdataset(msg, &qrdataset);
1527 }
1528 if (msg != NULL) {
1529 dns_message_detach(&msg);
1530 }
1531 if (soatuple != NULL) {
1532 dns_difftuple_free(&soatuple);
1533 }
1534 if (ver != NULL) {
1535 dns_db_closeversion(xfr->db, &ver, false);
1536 }
1537
1538 return (result);
1539 }
1540
1541 static void
1542 xfrin_send_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
1543 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)cbarg;
1544 dns_xfrin_ctx_t *recv_xfr = NULL;
1545
1546 REQUIRE(VALID_XFRIN(xfr));
1547
1548 isc_refcount_decrement0(&xfr->sends);
1549 if (atomic_load(&xfr->shuttingdown)) {
1550 result = ISC_R_SHUTTINGDOWN;
1551 }
1552
1553 CHECK(result);
1554
1555 xfrin_log(xfr, ISC_LOG_DEBUG(3), "sent request data");
1556
1557 dns_xfrin_attach(xfr, &recv_xfr);
1558 isc_nmhandle_attach(handle, &recv_xfr->readhandle);
1559 isc_refcount_increment0(&recv_xfr->recvs);
1560 isc_nm_read(recv_xfr->handle, xfrin_recv_done, recv_xfr);
1561
1562 failure:
1563 if (result != ISC_R_SUCCESS) {
1564 xfrin_fail(xfr, result, "failed sending request data");
1565 }
1566
1567 isc_nmhandle_detach(&xfr->sendhandle);
1568 dns_xfrin_detach(&xfr); /* send_xfr */
1569 }
1570
1571 static void
1572 xfrin_recv_done(isc_nmhandle_t *handle, isc_result_t result,
1573 isc_region_t *region, void *cbarg) {
1574 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)cbarg;
1575 dns_message_t *msg = NULL;
1576 dns_name_t *name = NULL;
1577 const dns_name_t *tsigowner = NULL;
1578 isc_buffer_t buffer;
1579 isc_sockaddr_t peer;
1580
1581 REQUIRE(VALID_XFRIN(xfr));
1582
1583 isc_refcount_decrement0(&xfr->recvs);
1584
1585 if (atomic_load(&xfr->shuttingdown)) {
1586 result = ISC_R_SHUTTINGDOWN;
1587 }
1588
1589 /* Stop the idle timer */
1590 (void)isc_timer_reset(xfr->max_idle_timer, isc_timertype_inactive, NULL,
1591 NULL, true);
1592
1593 CHECK(result);
1594
1595 xfrin_log(xfr, ISC_LOG_DEBUG(7), "received %u bytes", region->length);
1596
1597 dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTPARSE, &msg);
1598
1599 CHECK(dns_message_settsigkey(msg, xfr->tsigkey));
1600 CHECK(dns_message_setquerytsig(msg, xfr->lasttsig));
1601
1602 msg->tsigctx = xfr->tsigctx;
1603 xfr->tsigctx = NULL;
1604
1605 dns_message_setclass(msg, xfr->rdclass);
1606
1607 if (xfr->nmsg > 0) {
1608 msg->tcp_continuation = 1;
1609 }
1610
1611 isc_buffer_init(&buffer, region->base, region->length);
1612 isc_buffer_add(&buffer, region->length);
1613 peer = isc_nmhandle_peeraddr(handle);
1614
1615 result = dns_message_parse(msg, &buffer,
1616 DNS_MESSAGEPARSE_PRESERVEORDER);
1617 if (result == ISC_R_SUCCESS) {
1618 dns_message_logpacket(msg, "received message from", &peer,
1619 DNS_LOGCATEGORY_XFER_IN,
1620 DNS_LOGMODULE_XFER_IN, ISC_LOG_DEBUG(10),
1621 xfr->mctx);
1622 } else {
1623 xfrin_log(xfr, ISC_LOG_DEBUG(10), "dns_message_parse: %s",
1624 isc_result_totext(result));
1625 }
1626
1627 if (result != ISC_R_SUCCESS || msg->rcode != dns_rcode_noerror ||
1628 msg->opcode != dns_opcode_query || msg->rdclass != xfr->rdclass ||
1629 msg->id != xfr->id)
1630 {
1631 if (result == ISC_R_SUCCESS && msg->rcode != dns_rcode_noerror)
1632 {
1633 result = dns_result_fromrcode(msg->rcode);
1634 } else if (result == ISC_R_SUCCESS &&
1635 msg->opcode != dns_opcode_query)
1636 {
1637 result = DNS_R_UNEXPECTEDOPCODE;
1638 } else if (result == ISC_R_SUCCESS &&
1639 msg->rdclass != xfr->rdclass)
1640 {
1641 result = DNS_R_BADCLASS;
1642 } else if (result == ISC_R_SUCCESS || result == DNS_R_NOERROR) {
1643 result = DNS_R_UNEXPECTEDID;
1644 }
1645
1646 if (xfr->reqtype == dns_rdatatype_axfr ||
1647 xfr->reqtype == dns_rdatatype_soa)
1648 {
1649 goto failure;
1650 }
1651
1652 xfrin_log(xfr, ISC_LOG_DEBUG(3), "got %s, retrying with AXFR",
1653 isc_result_totext(result));
1654 try_axfr:
1655 isc_nmhandle_detach(&xfr->readhandle);
1656 dns_message_detach(&msg);
1657 xfrin_reset(xfr);
1658 xfr->reqtype = dns_rdatatype_soa;
1659 xfr->state = XFRST_SOAQUERY;
1660 result = xfrin_start(xfr);
1661 if (result != ISC_R_SUCCESS) {
1662 xfrin_fail(xfr, result, "failed setting up socket");
1663 }
1664 dns_xfrin_detach(&xfr); /* recv_xfr */
1665 return;
1666 }
1667
1668 /*
1669 * The question section should exist for SOA and in the first
1670 * message of a AXFR or IXFR response. The question section
1671 * may exist in the 2nd and subsequent messages in a AXFR or
1672 * IXFR response. If the question section exists it should
1673 * match the question that was sent.
1674 */
1675 if (msg->counts[DNS_SECTION_QUESTION] > 1) {
1676 xfrin_log(xfr, ISC_LOG_NOTICE, "too many questions (%u)",
1677 msg->counts[DNS_SECTION_QUESTION]);
1678 result = DNS_R_FORMERR;
1679 goto failure;
1680 }
1681
1682 if ((xfr->state == XFRST_SOAQUERY || xfr->state == XFRST_INITIALSOA) &&
1683 msg->counts[DNS_SECTION_QUESTION] != 1)
1684 {
1685 xfrin_log(xfr, ISC_LOG_NOTICE, "missing question section");
1686 result = DNS_R_FORMERR;
1687 goto failure;
1688 }
1689
1690 for (result = dns_message_firstname(msg, DNS_SECTION_QUESTION);
1691 result == ISC_R_SUCCESS;
1692 result = dns_message_nextname(msg, DNS_SECTION_QUESTION))
1693 {
1694 dns_rdataset_t *rds = NULL;
1695
1696 name = NULL;
1697 dns_message_currentname(msg, DNS_SECTION_QUESTION, &name);
1698 if (!dns_name_equal(name, &xfr->name)) {
1699 result = DNS_R_FORMERR;
1700 xfrin_log(xfr, ISC_LOG_NOTICE,
1701 "question name mismatch");
1702 goto failure;
1703 }
1704 rds = ISC_LIST_HEAD(name->list);
1705 INSIST(rds != NULL);
1706 if (rds->type != xfr->reqtype) {
1707 result = DNS_R_FORMERR;
1708 xfrin_log(xfr, ISC_LOG_NOTICE,
1709 "question type mismatch");
1710 goto failure;
1711 }
1712 if (rds->rdclass != xfr->rdclass) {
1713 result = DNS_R_FORMERR;
1714 xfrin_log(xfr, ISC_LOG_NOTICE,
1715 "question class mismatch");
1716 goto failure;
1717 }
1718 }
1719 if (result != ISC_R_NOMORE) {
1720 goto failure;
1721 }
1722
1723 /*
1724 * Does the server know about IXFR? If it doesn't we will get
1725 * a message with a empty answer section or a potentially a CNAME /
1726 * DNAME, the later is handled by xfr_rr() which will return FORMERR
1727 * if the first RR in the answer section is not a SOA record.
1728 */
1729 if (xfr->reqtype == dns_rdatatype_ixfr &&
1730 xfr->state == XFRST_INITIALSOA &&
1731 msg->counts[DNS_SECTION_ANSWER] == 0)
1732 {
1733 xfrin_log(xfr, ISC_LOG_DEBUG(3),
1734 "empty answer section, retrying with AXFR");
1735 goto try_axfr;
1736 }
1737
1738 if (xfr->reqtype == dns_rdatatype_soa &&
1739 (msg->flags & DNS_MESSAGEFLAG_AA) == 0)
1740 {
1741 FAIL(DNS_R_NOTAUTHORITATIVE);
1742 }
1743
1744 result = dns_message_checksig(msg, dns_zone_getview(xfr->zone));
1745 if (result != ISC_R_SUCCESS) {
1746 xfrin_log(xfr, ISC_LOG_DEBUG(3), "TSIG check failed: %s",
1747 isc_result_totext(result));
1748 goto failure;
1749 }
1750
1751 for (result = dns_message_firstname(msg, DNS_SECTION_ANSWER);
1752 result == ISC_R_SUCCESS;
1753 result = dns_message_nextname(msg, DNS_SECTION_ANSWER))
1754 {
1755 dns_rdataset_t *rds = NULL;
1756
1757 name = NULL;
1758 dns_message_currentname(msg, DNS_SECTION_ANSWER, &name);
1759 for (rds = ISC_LIST_HEAD(name->list); rds != NULL;
1760 rds = ISC_LIST_NEXT(rds, link))
1761 {
1762 for (result = dns_rdataset_first(rds);
1763 result == ISC_R_SUCCESS;
1764 result = dns_rdataset_next(rds))
1765 {
1766 dns_rdata_t rdata = DNS_RDATA_INIT;
1767 dns_rdataset_current(rds, &rdata);
1768 CHECK(xfr_rr(xfr, name, rds->ttl, &rdata));
1769 }
1770 }
1771 }
1772 if (result != ISC_R_NOMORE) {
1773 goto failure;
1774 }
1775
1776 if (dns_message_gettsig(msg, &tsigowner) != NULL) {
1777 /*
1778 * Reset the counter.
1779 */
1780 xfr->sincetsig = 0;
1781
1782 /*
1783 * Free the last tsig, if there is one.
1784 */
1785 if (xfr->lasttsig != NULL) {
1786 isc_buffer_free(&xfr->lasttsig);
1787 }
1788
1789 /*
1790 * Update the last tsig pointer.
1791 */
1792 CHECK(dns_message_getquerytsig(msg, xfr->mctx, &xfr->lasttsig));
1793 } else if (dns_message_gettsigkey(msg) != NULL) {
1794 xfr->sincetsig++;
1795 if (xfr->sincetsig > 100 || xfr->nmsg == 0 ||
1796 xfr->state == XFRST_AXFR_END ||
1797 xfr->state == XFRST_IXFR_END)
1798 {
1799 result = DNS_R_EXPECTEDTSIG;
1800 goto failure;
1801 }
1802 }
1803
1804 /*
1805 * Update the number of messages received.
1806 */
1807 xfr->nmsg++;
1808
1809 /*
1810 * Update the number of bytes received.
1811 */
1812 xfr->nbytes += buffer.used;
1813
1814 /*
1815 * Take the context back.
1816 */
1817 INSIST(xfr->tsigctx == NULL);
1818 xfr->tsigctx = msg->tsigctx;
1819 msg->tsigctx = NULL;
1820
1821 switch (xfr->state) {
1822 case XFRST_GOTSOA:
1823 xfr->reqtype = dns_rdatatype_axfr;
1824 xfr->state = XFRST_INITIALSOA;
1825 CHECK(xfrin_send_request(xfr));
1826 break;
1827 case XFRST_AXFR_END:
1828 CHECK(axfr_finalize(xfr));
1829 FALLTHROUGH;
1830 case XFRST_IXFR_END:
1831 /*
1832 * Close the journal.
1833 */
1834 if (xfr->ixfr.journal != NULL) {
1835 dns_journal_destroy(&xfr->ixfr.journal);
1836 }
1837
1838 /*
1839 * Inform the caller we succeeded.
1840 */
1841 if (xfr->done != NULL) {
1842 (xfr->done)(xfr->zone, ISC_R_SUCCESS);
1843 xfr->done = NULL;
1844 }
1845
1846 atomic_store(&xfr->shuttingdown, true);
1847 (void)isc_timer_reset(xfr->max_time_timer,
1848 isc_timertype_inactive, NULL, NULL, true);
1849 xfr->shutdown_result = ISC_R_SUCCESS;
1850 break;
1851 default:
1852 /*
1853 * Read the next message.
1854 */
1855 /* The readhandle is still attached */
1856 /* The recv_xfr is still attached */
1857 dns_message_detach(&msg);
1858 isc_refcount_increment0(&xfr->recvs);
1859 isc_nm_read(xfr->handle, xfrin_recv_done, xfr);
1860 isc_time_t next;
1861 isc_interval_t interval;
1862 isc_interval_set(&interval, dns_zone_getidlein(xfr->zone), 0);
1863 isc_time_nowplusinterval(&next, &interval);
1864 result = isc_timer_reset(xfr->max_idle_timer,
1865 isc_timertype_once, &next, NULL, true);
1866 RUNTIME_CHECK(result == ISC_R_SUCCESS);
1867 return;
1868 }
1869
1870 failure:
1871 if (result != ISC_R_SUCCESS) {
1872 xfrin_fail(xfr, result, "failed while receiving responses");
1873 }
1874
1875 if (msg != NULL) {
1876 dns_message_detach(&msg);
1877 }
1878 isc_nmhandle_detach(&xfr->readhandle);
1879 dns_xfrin_detach(&xfr); /* recv_xfr */
1880 }
1881
1882 static void
1883 xfrin_destroy(dns_xfrin_ctx_t *xfr) {
1884 uint64_t msecs;
1885 uint64_t persec;
1886 const char *result_str;
1887
1888 REQUIRE(VALID_XFRIN(xfr));
1889
1890 /* Safe-guards */
1891 REQUIRE(atomic_load(&xfr->shuttingdown));
1892 isc_refcount_destroy(&xfr->references);
1893 isc_refcount_destroy(&xfr->connects);
1894 isc_refcount_destroy(&xfr->recvs);
1895 isc_refcount_destroy(&xfr->sends);
1896
1897 INSIST(xfr->shutdown_result != ISC_R_UNSET);
1898
1899 /*
1900 * If we're called through dns_xfrin_detach() and are not
1901 * shutting down, we can't know what the transfer status is as
1902 * we are only called when the last reference is lost.
1903 */
1904 result_str = isc_result_totext(xfr->shutdown_result);
1905 xfrin_log(xfr, ISC_LOG_INFO, "Transfer status: %s", result_str);
1906
1907 /*
1908 * Calculate the length of time the transfer took,
1909 * and print a log message with the bytes and rate.
1910 */
1911 isc_time_now(&xfr->end);
1912 msecs = isc_time_microdiff(&xfr->end, &xfr->start) / 1000;
1913 if (msecs == 0) {
1914 msecs = 1;
1915 }
1916 persec = (xfr->nbytes * 1000) / msecs;
1917 xfrin_log(xfr, ISC_LOG_INFO,
1918 "Transfer completed: %d messages, %d records, "
1919 "%" PRIu64 " bytes, "
1920 "%u.%03u secs (%u bytes/sec) (serial %u)",
1921 xfr->nmsg, xfr->nrecs, xfr->nbytes,
1922 (unsigned int)(msecs / 1000), (unsigned int)(msecs % 1000),
1923 (unsigned int)persec, xfr->end_serial);
1924
1925 if (xfr->readhandle != NULL) {
1926 isc_nmhandle_detach(&xfr->readhandle);
1927 }
1928 if (xfr->sendhandle != NULL) {
1929 isc_nmhandle_detach(&xfr->sendhandle);
1930 }
1931
1932 if (xfr->transport != NULL) {
1933 dns_transport_detach(&xfr->transport);
1934 }
1935
1936 if (xfr->tsigkey != NULL) {
1937 dns_tsigkey_detach(&xfr->tsigkey);
1938 }
1939
1940 if (xfr->lasttsig != NULL) {
1941 isc_buffer_free(&xfr->lasttsig);
1942 }
1943
1944 dns_diff_clear(&xfr->diff);
1945
1946 if (xfr->ixfr.journal != NULL) {
1947 dns_journal_destroy(&xfr->ixfr.journal);
1948 }
1949
1950 if (xfr->axfr.add_private != NULL) {
1951 (void)dns_db_endload(xfr->db, &xfr->axfr);
1952 }
1953
1954 if (xfr->tsigctx != NULL) {
1955 dst_context_destroy(&xfr->tsigctx);
1956 }
1957
1958 if ((xfr->name.attributes & DNS_NAMEATTR_DYNAMIC) != 0) {
1959 dns_name_free(&xfr->name, xfr->mctx);
1960 }
1961
1962 if (xfr->ver != NULL) {
1963 dns_db_closeversion(xfr->db, &xfr->ver, false);
1964 }
1965
1966 if (xfr->db != NULL) {
1967 dns_db_detach(&xfr->db);
1968 }
1969
1970 if (xfr->zone != NULL) {
1971 if (!xfr->zone_had_db &&
1972 xfr->shutdown_result == ISC_R_SUCCESS &&
1973 dns_zone_gettype(xfr->zone) == dns_zone_mirror)
1974 {
1975 dns_zone_log(xfr->zone, ISC_LOG_INFO,
1976 "mirror zone is now in use");
1977 }
1978 xfrin_log(xfr, ISC_LOG_DEBUG(99), "freeing transfer context");
1979 /*
1980 * xfr->zone must not be detached before xfrin_log() is called.
1981 */
1982 dns_zone_idetach(&xfr->zone);
1983 }
1984
1985 if (xfr->firstsoa_data != NULL) {
1986 isc_mem_free(xfr->mctx, xfr->firstsoa_data);
1987 }
1988
1989 if (xfr->tlsctx_cache != NULL) {
1990 isc_tlsctx_cache_detach(&xfr->tlsctx_cache);
1991 }
1992
1993 isc_timer_destroy(&xfr->max_idle_timer);
1994 isc_timer_destroy(&xfr->max_time_timer);
1995
1996 isc_mem_putanddetach(&xfr->mctx, xfr, sizeof(*xfr));
1997 }
1998
1999 /*
2000 * Log incoming zone transfer messages in a format like
2001 * transfer of <zone> from <address>: <message>
2002 */
2003 static void
2004 xfrin_logv(int level, const char *zonetext, const isc_sockaddr_t *primaryaddr,
2005 const char *fmt, va_list ap) {
2006 char primarytext[ISC_SOCKADDR_FORMATSIZE];
2007 char msgtext[2048];
2008
2009 isc_sockaddr_format(primaryaddr, primarytext, sizeof(primarytext));
2010 vsnprintf(msgtext, sizeof(msgtext), fmt, ap);
2011
2012 isc_log_write(dns_lctx, DNS_LOGCATEGORY_XFER_IN, DNS_LOGMODULE_XFER_IN,
2013 level, "transfer of '%s' from %s: %s", zonetext,
2014 primarytext, msgtext);
2015 }
2016
2017 /*
2018 * Logging function for use when a xfrin_ctx_t has not yet been created.
2019 */
2020
2021 static void
2022 xfrin_log1(int level, const char *zonetext, const isc_sockaddr_t *primaryaddr,
2023 const char *fmt, ...) {
2024 va_list ap;
2025
2026 if (!isc_log_wouldlog(dns_lctx, level)) {
2027 return;
2028 }
2029
2030 va_start(ap, fmt);
2031 xfrin_logv(level, zonetext, primaryaddr, fmt, ap);
2032 va_end(ap);
2033 }
2034
2035 /*
2036 * Logging function for use when there is a xfrin_ctx_t.
2037 */
2038
2039 static void
2040 xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...) {
2041 va_list ap;
2042 char zonetext[DNS_NAME_MAXTEXT + 32];
2043
2044 if (!isc_log_wouldlog(dns_lctx, level)) {
2045 return;
2046 }
2047
2048 dns_zone_name(xfr->zone, zonetext, sizeof(zonetext));
2049
2050 va_start(ap, fmt);
2051 xfrin_logv(level, zonetext, &xfr->primaryaddr, fmt, ap);
2052 va_end(ap);
2053 }
2054