Coverage Report

Created: 2026-01-17 06:14

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
21.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
10.5k
txt_valid_regex(const unsigned char *txt) {
29
10.5k
  unsigned int nsub = 0;
30
10.5k
  char regex[256];
31
10.5k
  char *cp;
32
10.5k
  bool flags = false;
33
10.5k
  bool replace = false;
34
10.5k
  unsigned char c;
35
10.5k
  unsigned char delim;
36
10.5k
  unsigned int len;
37
10.5k
  int n;
38
39
10.5k
  len = *txt++;
40
10.5k
  if (len == 0U) {
41
2.65k
    return ISC_R_SUCCESS;
42
2.65k
  }
43
44
7.93k
  delim = *txt++;
45
7.93k
  len--;
46
47
  /*
48
   * Digits, backslash and flags can't be delimiters.
49
   */
50
7.93k
  switch (delim) {
51
4
  case '0':
52
9
  case '1':
53
14
  case '2':
54
18
  case '3':
55
22
  case '4':
56
27
  case '5':
57
31
  case '6':
58
35
  case '7':
59
39
  case '8':
60
43
  case '9':
61
47
  case '\\':
62
51
  case 'i':
63
56
  case 0:
64
56
    return DNS_R_SYNTAX;
65
7.93k
  }
66
67
7.87k
  cp = regex;
68
583k
  while (len-- > 0) {
69
575k
    c = *txt++;
70
575k
    if (c == 0) {
71
20
      return DNS_R_SYNTAX;
72
20
    }
73
575k
    if (c == delim && !replace) {
74
7.78k
      replace = true;
75
7.78k
      continue;
76
567k
    } else if (c == delim && !flags) {
77
7.44k
      flags = true;
78
7.44k
      continue;
79
560k
    } else if (c == delim) {
80
19
      return DNS_R_SYNTAX;
81
19
    }
82
    /*
83
     * Flags are not escaped.
84
     */
85
559k
    if (flags) {
86
717
      switch (c) {
87
704
      case 'i':
88
704
        continue;
89
13
      default:
90
13
        return DNS_R_SYNTAX;
91
717
      }
92
717
    }
93
559k
    if (!replace) {
94
490k
      *cp++ = c;
95
490k
    }
96
559k
    if (c == '\\') {
97
25.2k
      if (len == 0) {
98
11
        return DNS_R_SYNTAX;
99
11
      }
100
25.2k
      c = *txt++;
101
25.2k
      if (c == 0) {
102
6
        return DNS_R_SYNTAX;
103
6
      }
104
25.2k
      len--;
105
25.2k
      if (replace) {
106
14.6k
        switch (c) {
107
4
        case '0':
108
4
          return DNS_R_SYNTAX;
109
859
        case '1':
110
859
          if (nsub < 1) {
111
287
            nsub = 1;
112
287
          }
113
859
          break;
114
1.19k
        case '2':
115
1.19k
          if (nsub < 2) {
116
347
            nsub = 2;
117
347
          }
118
1.19k
          break;
119
982
        case '3':
120
982
          if (nsub < 3) {
121
150
            nsub = 3;
122
150
          }
123
982
          break;
124
1.83k
        case '4':
125
1.83k
          if (nsub < 4) {
126
602
            nsub = 4;
127
602
          }
128
1.83k
          break;
129
2.15k
        case '5':
130
2.15k
          if (nsub < 5) {
131
477
            nsub = 5;
132
477
          }
133
2.15k
          break;
134
633
        case '6':
135
633
          if (nsub < 6) {
136
153
            nsub = 6;
137
153
          }
138
633
          break;
139
520
        case '7':
140
520
          if (nsub < 7) {
141
162
            nsub = 7;
142
162
          }
143
520
          break;
144
673
        case '8':
145
673
          if (nsub < 8) {
146
188
            nsub = 8;
147
188
          }
148
673
          break;
149
594
        case '9':
150
594
          if (nsub < 9) {
151
247
            nsub = 9;
152
247
          }
153
594
          break;
154
14.6k
        }
155
14.6k
      }
156
25.2k
      if (!replace) {
157
10.6k
        *cp++ = c;
158
10.6k
      }
159
25.2k
    }
160
559k
  }
161
7.80k
  if (!flags) {
162
386
    return DNS_R_SYNTAX;
163
386
  }
164
7.41k
  *cp = '\0';
165
7.41k
  n = isc_regex_validate(regex);
166
7.41k
  if (n < 0 || nsub > (unsigned int)n) {
167
1.39k
    return DNS_R_SYNTAX;
168
1.39k
  }
169
6.02k
  return ISC_R_SUCCESS;
170
7.41k
}
171
172
static isc_result_t
173
5.01k
fromtext_naptr(ARGS_FROMTEXT) {
174
5.01k
  isc_token_t token;
175
5.01k
  isc_buffer_t buffer;
176
5.01k
  unsigned char *regex;
177
178
5.01k
  REQUIRE(type == dns_rdatatype_naptr);
179
180
5.01k
  UNUSED(type);
181
5.01k
  UNUSED(rdclass);
182
5.01k
  UNUSED(callbacks);
183
184
  /*
185
   * Order.
186
   */
187
5.01k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
188
5.01k
              false));
189
5.00k
  if (token.value.as_ulong > 0xffffU) {
190
29
    RETTOK(ISC_R_RANGE);
191
29
  }
192
4.97k
  RETERR(uint16_tobuffer(token.value.as_ulong, target));
193
194
  /*
195
   * Preference.
196
   */
197
4.97k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
198
4.97k
              false));
199
4.92k
  if (token.value.as_ulong > 0xffffU) {
200
17
    RETTOK(ISC_R_RANGE);
201
17
  }
202
4.91k
  RETERR(uint16_tobuffer(token.value.as_ulong, target));
203
204
  /*
205
   * Flags.
206
   */
207
4.91k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
208
4.91k
              false));
209
4.88k
  RETTOK(txt_fromtext(&token.value.as_textregion, target));
210
211
  /*
212
   * Service.
213
   */
214
4.87k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
215
4.87k
              false));
216
4.87k
  RETTOK(txt_fromtext(&token.value.as_textregion, target));
217
218
  /*
219
   * Regexp.
220
   */
221
4.86k
  regex = isc_buffer_used(target);
222
4.86k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
223
4.86k
              false));
224
4.86k
  RETTOK(txt_fromtext(&token.value.as_textregion, target));
225
4.86k
  RETTOK(txt_valid_regex(regex));
226
227
  /*
228
   * Replacement.
229
   */
230
3.70k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
231
3.70k
              false));
232
3.50k
  buffer_fromregion(&buffer, &token.value.as_region);
233
3.50k
  if (origin == NULL) {
234
2
    origin = dns_rootname;
235
2
  }
236
3.50k
  RETTOK(dns_name_wirefromtext(&buffer, origin, options, target));
237
3.50k
  return ISC_R_SUCCESS;
238
3.50k
}
239
240
static isc_result_t
241
4.16k
totext_naptr(ARGS_TOTEXT) {
242
4.16k
  isc_region_t region;
243
4.16k
  dns_name_t name;
244
4.16k
  dns_name_t prefix;
245
4.16k
  unsigned int opts;
246
4.16k
  char buf[sizeof("64000")];
247
4.16k
  unsigned short num;
248
249
4.16k
  REQUIRE(rdata->type == dns_rdatatype_naptr);
250
4.16k
  REQUIRE(rdata->length != 0);
251
252
4.16k
  dns_name_init(&name);
253
4.16k
  dns_name_init(&prefix);
254
255
4.16k
  dns_rdata_toregion(rdata, &region);
256
257
  /*
258
   * Order.
259
   */
260
4.16k
  num = uint16_fromregion(&region);
261
4.16k
  isc_region_consume(&region, 2);
262
4.16k
  snprintf(buf, sizeof(buf), "%u", num);
263
4.16k
  RETERR(str_totext(buf, target));
264
4.16k
  RETERR(str_totext(" ", target));
265
266
  /*
267
   * Preference.
268
   */
269
4.16k
  num = uint16_fromregion(&region);
270
4.16k
  isc_region_consume(&region, 2);
271
4.16k
  snprintf(buf, sizeof(buf), "%u", num);
272
4.16k
  RETERR(str_totext(buf, target));
273
4.16k
  RETERR(str_totext(" ", target));
274
275
  /*
276
   * Flags.
277
   */
278
4.16k
  RETERR(txt_totext(&region, true, target));
279
4.16k
  RETERR(str_totext(" ", target));
280
281
  /*
282
   * Service.
283
   */
284
4.16k
  RETERR(txt_totext(&region, true, target));
285
4.16k
  RETERR(str_totext(" ", target));
286
287
  /*
288
   * Regexp.
289
   */
290
4.16k
  RETERR(txt_totext(&region, true, target));
291
4.16k
  RETERR(str_totext(" ", target));
292
293
  /*
294
   * Replacement.
295
   */
296
4.16k
  dns_name_fromregion(&name, &region);
297
4.16k
  opts = name_prefix(&name, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT
298
4.16k
               : 0;
299
4.16k
  return dns_name_totext(&prefix, opts, target);
300
4.16k
}
301
302
static isc_result_t
303
6.80k
fromwire_naptr(ARGS_FROMWIRE) {
304
6.80k
  dns_name_t name;
305
6.80k
  isc_region_t sr;
306
6.80k
  unsigned char *regex;
307
308
6.80k
  REQUIRE(type == dns_rdatatype_naptr);
309
310
6.80k
  UNUSED(type);
311
6.80k
  UNUSED(rdclass);
312
313
6.80k
  dctx = dns_decompress_setpermitted(dctx, false);
314
315
6.80k
  dns_name_init(&name);
316
317
  /*
318
   * Order, preference.
319
   */
320
6.80k
  isc_buffer_activeregion(source, &sr);
321
6.80k
  if (sr.length < 4) {
322
11
    return ISC_R_UNEXPECTEDEND;
323
11
  }
324
6.79k
  RETERR(mem_tobuffer(target, sr.base, 4));
325
6.59k
  isc_buffer_forward(source, 4);
326
327
  /*
328
   * Flags.
329
   */
330
6.59k
  RETERR(txt_fromwire(source, target));
331
332
  /*
333
   * Service.
334
   */
335
6.38k
  RETERR(txt_fromwire(source, target));
336
337
  /*
338
   * Regexp.
339
   */
340
6.18k
  regex = isc_buffer_used(target);
341
6.18k
  RETERR(txt_fromwire(source, target));
342
5.72k
  RETERR(txt_valid_regex(regex));
343
344
  /*
345
   * Replacement.
346
   */
347
4.96k
  return dns_name_fromwire(&name, source, dctx, target);
348
5.72k
}
349
350
static isc_result_t
351
2.08k
towire_naptr(ARGS_TOWIRE) {
352
2.08k
  dns_name_t name;
353
2.08k
  isc_region_t sr;
354
355
2.08k
  REQUIRE(rdata->type == dns_rdatatype_naptr);
356
2.08k
  REQUIRE(rdata->length != 0);
357
358
2.08k
  dns_compress_setpermitted(cctx, false);
359
  /*
360
   * Order, preference.
361
   */
362
2.08k
  dns_rdata_toregion(rdata, &sr);
363
2.08k
  RETERR(mem_tobuffer(target, sr.base, 4));
364
2.08k
  isc_region_consume(&sr, 4);
365
366
  /*
367
   * Flags.
368
   */
369
2.08k
  RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
370
2.08k
  isc_region_consume(&sr, sr.base[0] + 1);
371
372
  /*
373
   * Service.
374
   */
375
2.08k
  RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
376
2.08k
  isc_region_consume(&sr, sr.base[0] + 1);
377
378
  /*
379
   * Regexp.
380
   */
381
2.08k
  RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
382
2.08k
  isc_region_consume(&sr, sr.base[0] + 1);
383
384
  /*
385
   * Replacement.
386
   */
387
2.08k
  dns_name_init(&name);
388
2.08k
  dns_name_fromregion(&name, &sr);
389
2.08k
  return dns_name_towire(&name, cctx, target);
390
2.08k
}
391
392
static int
393
16.6k
compare_naptr(ARGS_COMPARE) {
394
16.6k
  dns_name_t name1;
395
16.6k
  dns_name_t name2;
396
16.6k
  isc_region_t region1;
397
16.6k
  isc_region_t region2;
398
16.6k
  int order, len;
399
400
16.6k
  REQUIRE(rdata1->type == rdata2->type);
401
16.6k
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
402
16.6k
  REQUIRE(rdata1->type == dns_rdatatype_naptr);
403
16.6k
  REQUIRE(rdata1->length != 0);
404
16.6k
  REQUIRE(rdata2->length != 0);
405
406
16.6k
  dns_rdata_toregion(rdata1, &region1);
407
16.6k
  dns_rdata_toregion(rdata2, &region2);
408
409
  /*
410
   * Order, preference.
411
   */
412
16.6k
  order = memcmp(region1.base, region2.base, 4);
413
16.6k
  if (order != 0) {
414
2.19k
    return order < 0 ? -1 : 1;
415
2.19k
  }
416
14.4k
  isc_region_consume(&region1, 4);
417
14.4k
  isc_region_consume(&region2, 4);
418
419
  /*
420
   * Flags.
421
   */
422
14.4k
  len = ISC_MIN(region1.base[0], region2.base[0]);
423
14.4k
  order = memcmp(region1.base, region2.base, len + 1);
424
14.4k
  if (order != 0) {
425
2.42k
    return order < 0 ? -1 : 1;
426
2.42k
  }
427
12.0k
  isc_region_consume(&region1, region1.base[0] + 1);
428
12.0k
  isc_region_consume(&region2, region2.base[0] + 1);
429
430
  /*
431
   * Service.
432
   */
433
12.0k
  len = ISC_MIN(region1.base[0], region2.base[0]);
434
12.0k
  order = memcmp(region1.base, region2.base, len + 1);
435
12.0k
  if (order != 0) {
436
1.89k
    return order < 0 ? -1 : 1;
437
1.89k
  }
438
10.1k
  isc_region_consume(&region1, region1.base[0] + 1);
439
10.1k
  isc_region_consume(&region2, region2.base[0] + 1);
440
441
  /*
442
   * Regexp.
443
   */
444
10.1k
  len = ISC_MIN(region1.base[0], region2.base[0]);
445
10.1k
  order = memcmp(region1.base, region2.base, len + 1);
446
10.1k
  if (order != 0) {
447
7.19k
    return order < 0 ? -1 : 1;
448
7.19k
  }
449
2.93k
  isc_region_consume(&region1, region1.base[0] + 1);
450
2.93k
  isc_region_consume(&region2, region2.base[0] + 1);
451
452
  /*
453
   * Replacement.
454
   */
455
2.93k
  dns_name_init(&name1);
456
2.93k
  dns_name_init(&name2);
457
458
2.93k
  dns_name_fromregion(&name1, &region1);
459
2.93k
  dns_name_fromregion(&name2, &region2);
460
461
2.93k
  return dns_name_rdatacompare(&name1, &name2);
462
10.1k
}
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 */