Coverage Report

Created: 2026-02-26 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bind9/lib/dns/rdata/generic/naptr_35.c
Line
Count
Source
1
/*
2
 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3
 *
4
 * SPDX-License-Identifier: MPL-2.0
5
 *
6
 * This Source Code Form is subject to the terms of the Mozilla Public
7
 * License, v. 2.0. If a copy of the MPL was not distributed with this
8
 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
9
 *
10
 * See the COPYRIGHT file distributed with this work for additional
11
 * information regarding copyright ownership.
12
 */
13
14
/* RFC2915 */
15
16
#ifndef RDATA_GENERIC_NAPTR_35_C
17
#define RDATA_GENERIC_NAPTR_35_C
18
19
22.5k
#define RRTYPE_NAPTR_ATTRIBUTES (0)
20
21
#include <isc/regex.h>
22
23
/*
24
 * Check the wire format of the Regexp field.
25
 * Don't allow embedded NUL's.
26
 */
27
static isc_result_t
28
11.2k
txt_valid_regex(const unsigned char *txt) {
29
11.2k
  unsigned int nsub = 0;
30
11.2k
  char regex[256];
31
11.2k
  char *cp;
32
11.2k
  bool flags = false;
33
11.2k
  bool replace = false;
34
11.2k
  unsigned char c;
35
11.2k
  unsigned char delim;
36
11.2k
  unsigned int len;
37
11.2k
  int n;
38
39
11.2k
  len = *txt++;
40
11.2k
  if (len == 0U) {
41
2.56k
    return ISC_R_SUCCESS;
42
2.56k
  }
43
44
8.64k
  delim = *txt++;
45
8.64k
  len--;
46
47
  /*
48
   * Digits, backslash and flags can't be delimiters.
49
   */
50
8.64k
  switch (delim) {
51
6
  case '0':
52
10
  case '1':
53
14
  case '2':
54
18
  case '3':
55
25
  case '4':
56
29
  case '5':
57
33
  case '6':
58
37
  case '7':
59
41
  case '8':
60
45
  case '9':
61
49
  case '\\':
62
54
  case 'i':
63
58
  case 0:
64
58
    return DNS_R_SYNTAX;
65
8.64k
  }
66
67
8.58k
  cp = regex;
68
574k
  while (len-- > 0) {
69
566k
    c = *txt++;
70
566k
    if (c == 0) {
71
18
      return DNS_R_SYNTAX;
72
18
    }
73
566k
    if (c == delim && !replace) {
74
8.48k
      replace = true;
75
8.48k
      continue;
76
557k
    } else if (c == delim && !flags) {
77
8.14k
      flags = true;
78
8.14k
      continue;
79
549k
    } else if (c == delim) {
80
19
      return DNS_R_SYNTAX;
81
19
    }
82
    /*
83
     * Flags are not escaped.
84
     */
85
549k
    if (flags) {
86
713
      switch (c) {
87
700
      case 'i':
88
700
        continue;
89
13
      default:
90
13
        return DNS_R_SYNTAX;
91
713
      }
92
713
    }
93
548k
    if (!replace) {
94
483k
      *cp++ = c;
95
483k
    }
96
548k
    if (c == '\\') {
97
26.0k
      if (len == 0) {
98
11
        return DNS_R_SYNTAX;
99
11
      }
100
26.0k
      c = *txt++;
101
26.0k
      if (c == 0) {
102
6
        return DNS_R_SYNTAX;
103
6
      }
104
26.0k
      len--;
105
26.0k
      if (replace) {
106
14.2k
        switch (c) {
107
7
        case '0':
108
7
          return DNS_R_SYNTAX;
109
974
        case '1':
110
974
          if (nsub < 1) {
111
443
            nsub = 1;
112
443
          }
113
974
          break;
114
1.03k
        case '2':
115
1.03k
          if (nsub < 2) {
116
317
            nsub = 2;
117
317
          }
118
1.03k
          break;
119
958
        case '3':
120
958
          if (nsub < 3) {
121
231
            nsub = 3;
122
231
          }
123
958
          break;
124
1.61k
        case '4':
125
1.61k
          if (nsub < 4) {
126
515
            nsub = 4;
127
515
          }
128
1.61k
          break;
129
1.87k
        case '5':
130
1.87k
          if (nsub < 5) {
131
501
            nsub = 5;
132
501
          }
133
1.87k
          break;
134
1.18k
        case '6':
135
1.18k
          if (nsub < 6) {
136
715
            nsub = 6;
137
715
          }
138
1.18k
          break;
139
509
        case '7':
140
509
          if (nsub < 7) {
141
145
            nsub = 7;
142
145
          }
143
509
          break;
144
717
        case '8':
145
717
          if (nsub < 8) {
146
196
            nsub = 8;
147
196
          }
148
717
          break;
149
663
        case '9':
150
663
          if (nsub < 9) {
151
292
            nsub = 9;
152
292
          }
153
663
          break;
154
14.2k
        }
155
14.2k
      }
156
26.0k
      if (!replace) {
157
11.8k
        *cp++ = c;
158
11.8k
      }
159
26.0k
    }
160
548k
  }
161
8.50k
  if (!flags) {
162
393
    return DNS_R_SYNTAX;
163
393
  }
164
8.11k
  *cp = '\0';
165
8.11k
  n = isc_regex_validate(regex);
166
8.11k
  if (n < 0 || nsub > (unsigned int)n) {
167
1.38k
    return DNS_R_SYNTAX;
168
1.38k
  }
169
6.73k
  return ISC_R_SUCCESS;
170
8.11k
}
171
172
static isc_result_t
173
4.77k
fromtext_naptr(ARGS_FROMTEXT) {
174
4.77k
  isc_token_t token;
175
4.77k
  isc_buffer_t buffer;
176
4.77k
  unsigned char *regex;
177
178
4.77k
  REQUIRE(type == dns_rdatatype_naptr);
179
180
4.77k
  UNUSED(type);
181
4.77k
  UNUSED(rdclass);
182
4.77k
  UNUSED(callbacks);
183
184
  /*
185
   * Order.
186
   */
187
4.77k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
188
4.77k
              false));
189
4.76k
  if (token.value.as_ulong > 0xffffU) {
190
22
    RETTOK(ISC_R_RANGE);
191
22
  }
192
4.74k
  RETERR(uint16_tobuffer(token.value.as_ulong, target));
193
194
  /*
195
   * Preference.
196
   */
197
4.74k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
198
4.74k
              false));
199
4.70k
  if (token.value.as_ulong > 0xffffU) {
200
24
    RETTOK(ISC_R_RANGE);
201
24
  }
202
4.67k
  RETERR(uint16_tobuffer(token.value.as_ulong, target));
203
204
  /*
205
   * Flags.
206
   */
207
4.67k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
208
4.67k
              false));
209
4.64k
  RETTOK(txt_fromtext(&token.value.as_textregion, target));
210
211
  /*
212
   * Service.
213
   */
214
4.63k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
215
4.63k
              false));
216
4.62k
  RETTOK(txt_fromtext(&token.value.as_textregion, target));
217
218
  /*
219
   * Regexp.
220
   */
221
4.62k
  regex = isc_buffer_used(target);
222
4.62k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
223
4.62k
              false));
224
4.61k
  RETTOK(txt_fromtext(&token.value.as_textregion, target));
225
4.61k
  RETTOK(txt_valid_regex(regex));
226
227
  /*
228
   * Replacement.
229
   */
230
3.47k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
231
3.47k
              false));
232
3.27k
  buffer_fromregion(&buffer, &token.value.as_region);
233
3.27k
  if (origin == NULL) {
234
2
    origin = dns_rootname;
235
2
  }
236
3.27k
  RETTOK(dns_name_wirefromtext(&buffer, origin, options, target));
237
3.27k
  return ISC_R_SUCCESS;
238
3.27k
}
239
240
static isc_result_t
241
5.09k
totext_naptr(ARGS_TOTEXT) {
242
5.09k
  isc_region_t region;
243
5.09k
  dns_name_t name;
244
5.09k
  dns_name_t prefix;
245
5.09k
  unsigned int opts;
246
5.09k
  char buf[sizeof("64000")];
247
5.09k
  unsigned short num;
248
249
5.09k
  REQUIRE(rdata->type == dns_rdatatype_naptr);
250
5.09k
  REQUIRE(rdata->length != 0);
251
252
5.09k
  dns_name_init(&name);
253
5.09k
  dns_name_init(&prefix);
254
255
5.09k
  dns_rdata_toregion(rdata, &region);
256
257
  /*
258
   * Order.
259
   */
260
5.09k
  num = uint16_fromregion(&region);
261
5.09k
  isc_region_consume(&region, 2);
262
5.09k
  snprintf(buf, sizeof(buf), "%u", num);
263
5.09k
  RETERR(str_totext(buf, target));
264
5.09k
  RETERR(str_totext(" ", target));
265
266
  /*
267
   * Preference.
268
   */
269
5.09k
  num = uint16_fromregion(&region);
270
5.09k
  isc_region_consume(&region, 2);
271
5.09k
  snprintf(buf, sizeof(buf), "%u", num);
272
5.09k
  RETERR(str_totext(buf, target));
273
5.09k
  RETERR(str_totext(" ", target));
274
275
  /*
276
   * Flags.
277
   */
278
5.09k
  RETERR(txt_totext(&region, true, target));
279
5.09k
  RETERR(str_totext(" ", target));
280
281
  /*
282
   * Service.
283
   */
284
5.09k
  RETERR(txt_totext(&region, true, target));
285
5.09k
  RETERR(str_totext(" ", target));
286
287
  /*
288
   * Regexp.
289
   */
290
5.09k
  RETERR(txt_totext(&region, true, target));
291
5.09k
  RETERR(str_totext(" ", target));
292
293
  /*
294
   * Replacement.
295
   */
296
5.09k
  dns_name_fromregion(&name, &region);
297
5.09k
  opts = name_prefix(&name, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT
298
5.09k
               : 0;
299
5.09k
  return dns_name_totext(&prefix, opts, target);
300
5.09k
}
301
302
static isc_result_t
303
7.68k
fromwire_naptr(ARGS_FROMWIRE) {
304
7.68k
  dns_name_t name;
305
7.68k
  isc_region_t sr;
306
7.68k
  unsigned char *regex;
307
308
7.68k
  REQUIRE(type == dns_rdatatype_naptr);
309
310
7.68k
  UNUSED(type);
311
7.68k
  UNUSED(rdclass);
312
313
7.68k
  dctx = dns_decompress_setpermitted(dctx, false);
314
315
7.68k
  dns_name_init(&name);
316
317
  /*
318
   * Order, preference.
319
   */
320
7.68k
  isc_buffer_activeregion(source, &sr);
321
7.68k
  if (sr.length < 4) {
322
12
    return ISC_R_UNEXPECTEDEND;
323
12
  }
324
7.67k
  RETERR(mem_tobuffer(target, sr.base, 4));
325
7.46k
  isc_buffer_forward(source, 4);
326
327
  /*
328
   * Flags.
329
   */
330
7.46k
  RETERR(txt_fromwire(source, target));
331
332
  /*
333
   * Service.
334
   */
335
7.26k
  RETERR(txt_fromwire(source, target));
336
337
  /*
338
   * Regexp.
339
   */
340
7.05k
  regex = isc_buffer_used(target);
341
7.05k
  RETERR(txt_fromwire(source, target));
342
6.59k
  RETERR(txt_valid_regex(regex));
343
344
  /*
345
   * Replacement.
346
   */
347
5.82k
  return dns_name_fromwire(&name, source, dctx, target);
348
6.59k
}
349
350
static isc_result_t
351
2.55k
towire_naptr(ARGS_TOWIRE) {
352
2.55k
  dns_name_t name;
353
2.55k
  isc_region_t sr;
354
355
2.55k
  REQUIRE(rdata->type == dns_rdatatype_naptr);
356
2.55k
  REQUIRE(rdata->length != 0);
357
358
2.55k
  dns_compress_setpermitted(cctx, false);
359
  /*
360
   * Order, preference.
361
   */
362
2.55k
  dns_rdata_toregion(rdata, &sr);
363
2.55k
  RETERR(mem_tobuffer(target, sr.base, 4));
364
2.54k
  isc_region_consume(&sr, 4);
365
366
  /*
367
   * Flags.
368
   */
369
2.54k
  RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
370
2.54k
  isc_region_consume(&sr, sr.base[0] + 1);
371
372
  /*
373
   * Service.
374
   */
375
2.54k
  RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
376
2.54k
  isc_region_consume(&sr, sr.base[0] + 1);
377
378
  /*
379
   * Regexp.
380
   */
381
2.54k
  RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
382
2.54k
  isc_region_consume(&sr, sr.base[0] + 1);
383
384
  /*
385
   * Replacement.
386
   */
387
2.54k
  dns_name_init(&name);
388
2.54k
  dns_name_fromregion(&name, &sr);
389
2.54k
  return dns_name_towire(&name, cctx, target);
390
2.54k
}
391
392
static int
393
16.9k
compare_naptr(ARGS_COMPARE) {
394
16.9k
  dns_name_t name1;
395
16.9k
  dns_name_t name2;
396
16.9k
  isc_region_t region1;
397
16.9k
  isc_region_t region2;
398
16.9k
  int order, len;
399
400
16.9k
  REQUIRE(rdata1->type == rdata2->type);
401
16.9k
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
402
16.9k
  REQUIRE(rdata1->type == dns_rdatatype_naptr);
403
16.9k
  REQUIRE(rdata1->length != 0);
404
16.9k
  REQUIRE(rdata2->length != 0);
405
406
16.9k
  dns_rdata_toregion(rdata1, &region1);
407
16.9k
  dns_rdata_toregion(rdata2, &region2);
408
409
  /*
410
   * Order, preference.
411
   */
412
16.9k
  order = memcmp(region1.base, region2.base, 4);
413
16.9k
  if (order != 0) {
414
2.90k
    return order < 0 ? -1 : 1;
415
2.90k
  }
416
14.0k
  isc_region_consume(&region1, 4);
417
14.0k
  isc_region_consume(&region2, 4);
418
419
  /*
420
   * Flags.
421
   */
422
14.0k
  len = ISC_MIN(region1.base[0], region2.base[0]);
423
14.0k
  order = memcmp(region1.base, region2.base, len + 1);
424
14.0k
  if (order != 0) {
425
2.31k
    return order < 0 ? -1 : 1;
426
2.31k
  }
427
11.6k
  isc_region_consume(&region1, region1.base[0] + 1);
428
11.6k
  isc_region_consume(&region2, region2.base[0] + 1);
429
430
  /*
431
   * Service.
432
   */
433
11.6k
  len = ISC_MIN(region1.base[0], region2.base[0]);
434
11.6k
  order = memcmp(region1.base, region2.base, len + 1);
435
11.6k
  if (order != 0) {
436
2.10k
    return order < 0 ? -1 : 1;
437
2.10k
  }
438
9.58k
  isc_region_consume(&region1, region1.base[0] + 1);
439
9.58k
  isc_region_consume(&region2, region2.base[0] + 1);
440
441
  /*
442
   * Regexp.
443
   */
444
9.58k
  len = ISC_MIN(region1.base[0], region2.base[0]);
445
9.58k
  order = memcmp(region1.base, region2.base, len + 1);
446
9.58k
  if (order != 0) {
447
7.04k
    return order < 0 ? -1 : 1;
448
7.04k
  }
449
2.53k
  isc_region_consume(&region1, region1.base[0] + 1);
450
2.53k
  isc_region_consume(&region2, region2.base[0] + 1);
451
452
  /*
453
   * Replacement.
454
   */
455
2.53k
  dns_name_init(&name1);
456
2.53k
  dns_name_init(&name2);
457
458
2.53k
  dns_name_fromregion(&name1, &region1);
459
2.53k
  dns_name_fromregion(&name2, &region2);
460
461
2.53k
  return dns_name_rdatacompare(&name1, &name2);
462
9.58k
}
463
464
static isc_result_t
465
0
fromstruct_naptr(ARGS_FROMSTRUCT) {
466
0
  dns_rdata_naptr_t *naptr = source;
467
0
  isc_region_t region;
468
469
0
  REQUIRE(type == dns_rdatatype_naptr);
470
0
  REQUIRE(naptr != NULL);
471
0
  REQUIRE(naptr->common.rdtype == type);
472
0
  REQUIRE(naptr->common.rdclass == rdclass);
473
0
  REQUIRE(naptr->flags != NULL || naptr->flags_len == 0);
474
0
  REQUIRE(naptr->service != NULL || naptr->service_len == 0);
475
0
  REQUIRE(naptr->regexp != NULL || naptr->regexp_len == 0);
476
477
0
  UNUSED(type);
478
0
  UNUSED(rdclass);
479
480
0
  RETERR(uint16_tobuffer(naptr->order, target));
481
0
  RETERR(uint16_tobuffer(naptr->preference, target));
482
0
  RETERR(uint8_tobuffer(naptr->flags_len, target));
483
0
  RETERR(mem_tobuffer(target, naptr->flags, naptr->flags_len));
484
0
  RETERR(uint8_tobuffer(naptr->service_len, target));
485
0
  RETERR(mem_tobuffer(target, naptr->service, naptr->service_len));
486
0
  RETERR(uint8_tobuffer(naptr->regexp_len, target));
487
0
  RETERR(mem_tobuffer(target, naptr->regexp, naptr->regexp_len));
488
0
  dns_name_toregion(&naptr->replacement, &region);
489
0
  return isc_buffer_copyregion(target, &region);
490
0
}
491
492
static isc_result_t
493
0
tostruct_naptr(ARGS_TOSTRUCT) {
494
0
  dns_rdata_naptr_t *naptr = target;
495
0
  isc_region_t r;
496
0
  dns_name_t name;
497
498
0
  REQUIRE(rdata->type == dns_rdatatype_naptr);
499
0
  REQUIRE(naptr != NULL);
500
0
  REQUIRE(rdata->length != 0);
501
502
0
  DNS_RDATACOMMON_INIT(naptr, rdata->type, rdata->rdclass);
503
504
0
  naptr->flags = NULL;
505
0
  naptr->service = NULL;
506
0
  naptr->regexp = NULL;
507
508
0
  dns_rdata_toregion(rdata, &r);
509
510
0
  naptr->order = uint16_fromregion(&r);
511
0
  isc_region_consume(&r, 2);
512
513
0
  naptr->preference = uint16_fromregion(&r);
514
0
  isc_region_consume(&r, 2);
515
516
0
  naptr->flags_len = uint8_fromregion(&r);
517
0
  isc_region_consume(&r, 1);
518
0
  INSIST(naptr->flags_len <= r.length);
519
0
  naptr->flags = mem_maybedup(mctx, r.base, naptr->flags_len);
520
0
  isc_region_consume(&r, naptr->flags_len);
521
522
0
  naptr->service_len = uint8_fromregion(&r);
523
0
  isc_region_consume(&r, 1);
524
0
  INSIST(naptr->service_len <= r.length);
525
0
  naptr->service = mem_maybedup(mctx, r.base, naptr->service_len);
526
0
  isc_region_consume(&r, naptr->service_len);
527
528
0
  naptr->regexp_len = uint8_fromregion(&r);
529
0
  isc_region_consume(&r, 1);
530
0
  INSIST(naptr->regexp_len <= r.length);
531
0
  naptr->regexp = mem_maybedup(mctx, r.base, naptr->regexp_len);
532
0
  isc_region_consume(&r, naptr->regexp_len);
533
534
0
  dns_name_init(&name);
535
0
  dns_name_fromregion(&name, &r);
536
0
  dns_name_init(&naptr->replacement);
537
0
  name_duporclone(&name, mctx, &naptr->replacement);
538
0
  naptr->mctx = mctx;
539
0
  return ISC_R_SUCCESS;
540
0
}
541
542
static void
543
0
freestruct_naptr(ARGS_FREESTRUCT) {
544
0
  dns_rdata_naptr_t *naptr = source;
545
546
0
  REQUIRE(naptr != NULL);
547
0
  REQUIRE(naptr->common.rdtype == dns_rdatatype_naptr);
548
549
0
  if (naptr->mctx == NULL) {
550
0
    return;
551
0
  }
552
553
0
  if (naptr->flags != NULL) {
554
0
    isc_mem_free(naptr->mctx, naptr->flags);
555
0
  }
556
0
  if (naptr->service != NULL) {
557
0
    isc_mem_free(naptr->mctx, naptr->service);
558
0
  }
559
0
  if (naptr->regexp != NULL) {
560
0
    isc_mem_free(naptr->mctx, naptr->regexp);
561
0
  }
562
0
  dns_name_free(&naptr->replacement, naptr->mctx);
563
0
  naptr->mctx = NULL;
564
0
}
565
566
static isc_result_t
567
0
additionaldata_naptr(ARGS_ADDLDATA) {
568
0
  dns_name_t name;
569
0
  isc_region_t sr;
570
0
  dns_rdatatype_t atype;
571
0
  unsigned int i, flagslen;
572
0
  char *cp;
573
574
0
  REQUIRE(rdata->type == dns_rdatatype_naptr);
575
576
0
  UNUSED(owner);
577
578
  /*
579
   * Order, preference.
580
   */
581
0
  dns_rdata_toregion(rdata, &sr);
582
0
  isc_region_consume(&sr, 4);
583
584
  /*
585
   * Flags.
586
   */
587
0
  atype = dns_rdatatype_none;
588
0
  flagslen = sr.base[0];
589
0
  cp = (char *)&sr.base[1];
590
0
  for (i = 0; i < flagslen; i++, cp++) {
591
0
    if (*cp == 'S' || *cp == 's') {
592
0
      atype = dns_rdatatype_srv;
593
0
      break;
594
0
    }
595
0
    if (*cp == 'A' || *cp == 'a') {
596
0
      atype = dns_rdatatype_a;
597
0
      break;
598
0
    }
599
0
  }
600
0
  isc_region_consume(&sr, flagslen + 1);
601
602
  /*
603
   * Service.
604
   */
605
0
  isc_region_consume(&sr, sr.base[0] + 1);
606
607
  /*
608
   * Regexp.
609
   */
610
0
  isc_region_consume(&sr, sr.base[0] + 1);
611
612
  /*
613
   * Replacement.
614
   */
615
0
  dns_name_init(&name);
616
0
  dns_name_fromregion(&name, &sr);
617
618
0
  if (atype != 0) {
619
0
    return (add)(arg, &name, atype, NULL DNS__DB_FILELINE);
620
0
  }
621
622
0
  return ISC_R_SUCCESS;
623
0
}
624
625
static isc_result_t
626
0
digest_naptr(ARGS_DIGEST) {
627
0
  isc_region_t r1, r2;
628
0
  unsigned int length, n;
629
0
  dns_name_t name;
630
631
0
  REQUIRE(rdata->type == dns_rdatatype_naptr);
632
633
0
  dns_rdata_toregion(rdata, &r1);
634
0
  r2 = r1;
635
0
  length = 0;
636
637
  /*
638
   * Order, preference.
639
   */
640
0
  length += 4;
641
0
  isc_region_consume(&r2, 4);
642
643
  /*
644
   * Flags.
645
   */
646
0
  n = r2.base[0] + 1;
647
0
  length += n;
648
0
  isc_region_consume(&r2, n);
649
650
  /*
651
   * Service.
652
   */
653
0
  n = r2.base[0] + 1;
654
0
  length += n;
655
0
  isc_region_consume(&r2, n);
656
657
  /*
658
   * Regexp.
659
   */
660
0
  n = r2.base[0] + 1;
661
0
  length += n;
662
0
  isc_region_consume(&r2, n);
663
664
  /*
665
   * Digest the RR up to the replacement name.
666
   */
667
0
  r1.length = length;
668
0
  RETERR((digest)(arg, &r1));
669
670
  /*
671
   * Replacement.
672
   */
673
674
0
  dns_name_init(&name);
675
0
  dns_name_fromregion(&name, &r2);
676
677
0
  return dns_name_digest(&name, digest, arg);
678
0
}
679
680
static bool
681
0
checkowner_naptr(ARGS_CHECKOWNER) {
682
0
  REQUIRE(type == dns_rdatatype_naptr);
683
684
0
  UNUSED(name);
685
0
  UNUSED(type);
686
0
  UNUSED(rdclass);
687
0
  UNUSED(wildcard);
688
689
0
  return true;
690
0
}
691
692
static bool
693
0
checknames_naptr(ARGS_CHECKNAMES) {
694
0
  REQUIRE(rdata->type == dns_rdatatype_naptr);
695
696
0
  UNUSED(rdata);
697
0
  UNUSED(owner);
698
0
  UNUSED(bad);
699
700
0
  return true;
701
0
}
702
703
static int
704
0
casecompare_naptr(ARGS_COMPARE) {
705
0
  return compare_naptr(rdata1, rdata2);
706
0
}
707
708
#endif /* RDATA_GENERIC_NAPTR_35_C */