Coverage Report

Created: 2026-08-13 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bind9/lib/dns/rdata/generic/ptr_12.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
#ifndef RDATA_GENERIC_PTR_12_C
15
#define RDATA_GENERIC_PTR_12_C
16
17
21.6k
#define RRTYPE_PTR_ATTRIBUTES (0)
18
19
static isc_result_t
20
11.8k
fromtext_ptr(ARGS_FROMTEXT) {
21
11.8k
  isc_token_t token;
22
11.8k
  isc_buffer_t buffer;
23
11.8k
  dns_fixedname_t fn;
24
11.8k
  dns_name_t *name = dns_fixedname_initname(&fn);
25
26
11.8k
  REQUIRE(type == dns_rdatatype_ptr);
27
28
11.8k
  UNUSED(type);
29
11.8k
  UNUSED(rdclass);
30
11.8k
  UNUSED(callbacks);
31
32
11.8k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
33
11.8k
              false));
34
35
11.8k
  buffer_fromregion(&buffer, &token.value.as_region);
36
11.8k
  if (origin == NULL) {
37
12
    origin = dns_rootname;
38
12
  }
39
40
11.8k
  RETTOK(dns_name_fromtext(name, &buffer, origin, options));
41
11.8k
  RETTOK(dns_name_towire(name, NULL, target));
42
43
11.8k
  if (rdclass == dns_rdataclass_in &&
44
11.7k
      (options & DNS_RDATA_CHECKNAMES) != 0 &&
45
0
      (options & DNS_RDATA_CHECKREVERSE) != 0)
46
0
  {
47
0
    bool ok;
48
0
    ok = dns_name_ishostname(name, false);
49
0
    if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) {
50
0
      RETTOK(DNS_R_BADNAME);
51
0
    }
52
0
    if (!ok && callbacks != NULL) {
53
0
      warn_badname(name, lexer, callbacks);
54
0
    }
55
0
  }
56
11.8k
  return ISC_R_SUCCESS;
57
11.8k
}
58
59
static isc_result_t
60
1.05k
totext_ptr(ARGS_TOTEXT) {
61
1.05k
  isc_region_t region;
62
1.05k
  dns_name_t name;
63
1.05k
  dns_name_t prefix;
64
1.05k
  unsigned int opts;
65
66
1.05k
  REQUIRE(rdata->type == dns_rdatatype_ptr);
67
1.05k
  REQUIRE(rdata->length != 0);
68
69
1.05k
  dns_name_init(&name);
70
1.05k
  dns_name_init(&prefix);
71
72
1.05k
  dns_rdata_toregion(rdata, &region);
73
1.05k
  dns_name_fromregion(&name, &region);
74
75
1.05k
  opts = name_prefix(&name, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT
76
1.05k
               : 0;
77
1.05k
  return dns_name_totext(&prefix, opts, target);
78
1.05k
}
79
80
static isc_result_t
81
1.94k
fromwire_ptr(ARGS_FROMWIRE) {
82
1.94k
  dns_name_t name;
83
84
1.94k
  REQUIRE(type == dns_rdatatype_ptr);
85
86
1.94k
  UNUSED(type);
87
1.94k
  UNUSED(rdclass);
88
89
1.94k
  dctx = dns_decompress_setpermitted(dctx, true);
90
91
1.94k
  dns_name_init(&name);
92
1.94k
  return dns_name_fromwire(&name, source, dctx, target);
93
1.94k
}
94
95
static isc_result_t
96
528
towire_ptr(ARGS_TOWIRE) {
97
528
  dns_name_t name;
98
528
  isc_region_t region;
99
100
528
  REQUIRE(rdata->type == dns_rdatatype_ptr);
101
528
  REQUIRE(rdata->length != 0);
102
103
528
  dns_compress_setpermitted(cctx, true);
104
105
528
  dns_name_init(&name);
106
528
  dns_rdata_toregion(rdata, &region);
107
528
  dns_name_fromregion(&name, &region);
108
109
528
  return dns_name_towire(&name, cctx, target);
110
528
}
111
112
static int
113
11.2M
compare_ptr(ARGS_COMPARE) {
114
11.2M
  dns_name_t name1;
115
11.2M
  dns_name_t name2;
116
11.2M
  isc_region_t region1;
117
11.2M
  isc_region_t region2;
118
119
11.2M
  REQUIRE(rdata1->type == rdata2->type);
120
11.2M
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
121
11.2M
  REQUIRE(rdata1->type == dns_rdatatype_ptr);
122
11.2M
  REQUIRE(rdata1->length != 0);
123
11.2M
  REQUIRE(rdata2->length != 0);
124
125
11.2M
  dns_name_init(&name1);
126
11.2M
  dns_name_init(&name2);
127
128
11.2M
  dns_rdata_toregion(rdata1, &region1);
129
11.2M
  dns_rdata_toregion(rdata2, &region2);
130
131
11.2M
  dns_name_fromregion(&name1, &region1);
132
11.2M
  dns_name_fromregion(&name2, &region2);
133
134
11.2M
  return dns_name_rdatacompare(&name1, &name2);
135
11.2M
}
136
137
static isc_result_t
138
0
fromstruct_ptr(ARGS_FROMSTRUCT) {
139
0
  dns_rdata_ptr_t *ptr = source;
140
0
  isc_region_t region;
141
142
0
  REQUIRE(type == dns_rdatatype_ptr);
143
0
  REQUIRE(ptr != NULL);
144
0
  REQUIRE(ptr->common.rdtype == type);
145
0
  REQUIRE(ptr->common.rdclass == rdclass);
146
147
0
  UNUSED(type);
148
0
  UNUSED(rdclass);
149
150
0
  dns_name_toregion(&ptr->ptr, &region);
151
0
  return isc_buffer_copyregion(target, &region);
152
0
}
153
154
static isc_result_t
155
0
tostruct_ptr(ARGS_TOSTRUCT) {
156
0
  isc_region_t region;
157
0
  dns_rdata_ptr_t *ptr = target;
158
0
  dns_name_t name;
159
160
0
  REQUIRE(rdata->type == dns_rdatatype_ptr);
161
0
  REQUIRE(ptr != NULL);
162
0
  REQUIRE(rdata->length != 0);
163
164
0
  DNS_RDATACOMMON_INIT(ptr, rdata->type, rdata->rdclass);
165
166
0
  dns_name_init(&name);
167
0
  dns_rdata_toregion(rdata, &region);
168
0
  dns_name_fromregion(&name, &region);
169
0
  dns_name_init(&ptr->ptr);
170
0
  name_duporclone(&name, mctx, &ptr->ptr);
171
0
  ptr->mctx = mctx;
172
0
  return ISC_R_SUCCESS;
173
0
}
174
175
static void
176
0
freestruct_ptr(ARGS_FREESTRUCT) {
177
0
  dns_rdata_ptr_t *ptr = source;
178
179
0
  REQUIRE(ptr != NULL);
180
0
  REQUIRE(ptr->common.rdtype == dns_rdatatype_ptr);
181
182
0
  if (ptr->mctx == NULL) {
183
0
    return;
184
0
  }
185
186
0
  dns_name_free(&ptr->ptr, ptr->mctx);
187
0
  ptr->mctx = NULL;
188
0
}
189
190
static isc_result_t
191
0
additionaldata_ptr(ARGS_ADDLDATA) {
192
0
  REQUIRE(rdata->type == dns_rdatatype_ptr);
193
194
0
  UNUSED(rdata);
195
0
  UNUSED(owner);
196
0
  UNUSED(add);
197
0
  UNUSED(arg);
198
199
0
  return ISC_R_SUCCESS;
200
0
}
201
202
static isc_result_t
203
0
digest_ptr(ARGS_DIGEST) {
204
0
  isc_region_t r;
205
0
  dns_name_t name;
206
207
0
  REQUIRE(rdata->type == dns_rdatatype_ptr);
208
209
0
  dns_rdata_toregion(rdata, &r);
210
0
  dns_name_init(&name);
211
0
  dns_name_fromregion(&name, &r);
212
213
0
  return dns_name_digest(&name, digest, arg);
214
0
}
215
216
static bool
217
0
checkowner_ptr(ARGS_CHECKOWNER) {
218
0
  REQUIRE(type == dns_rdatatype_ptr);
219
220
0
  UNUSED(name);
221
0
  UNUSED(type);
222
0
  UNUSED(rdclass);
223
0
  UNUSED(wildcard);
224
225
0
  return true;
226
0
}
227
228
static bool
229
0
checknames_ptr(ARGS_CHECKNAMES) {
230
0
  isc_region_t region;
231
0
  dns_name_t name;
232
233
0
  REQUIRE(rdata->type == dns_rdatatype_ptr);
234
235
0
  if (rdata->rdclass != dns_rdataclass_in) {
236
0
    return true;
237
0
  }
238
239
0
  if (dns_name_isdnssd(owner)) {
240
0
    return true;
241
0
  }
242
243
0
  if (dns_name_issubdomain(owner, dns_inaddrarpa) ||
244
0
      dns_name_issubdomain(owner, dns_ip6arpa) ||
245
0
      dns_name_issubdomain(owner, dns_ip6int))
246
0
  {
247
0
    dns_rdata_toregion(rdata, &region);
248
0
    dns_name_init(&name);
249
0
    dns_name_fromregion(&name, &region);
250
0
    if (!dns_name_ishostname(&name, false)) {
251
0
      if (bad != NULL) {
252
0
        dns_name_clone(&name, bad);
253
0
      }
254
0
      return false;
255
0
    }
256
0
  }
257
0
  return true;
258
0
}
259
260
static int
261
0
casecompare_ptr(ARGS_COMPARE) {
262
0
  return compare_ptr(rdata1, rdata2);
263
0
}
264
#endif /* RDATA_GENERIC_PTR_12_C */