Coverage Report

Created: 2023-06-07 06:23

/src/bind9/lib/dns/rdata/generic/rp_17.c
Line
Count
Source (jump to first uncovered line)
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
/* RFC1183 */
15
16
#ifndef RDATA_GENERIC_RP_17_C
17
#define RDATA_GENERIC_RP_17_C
18
19
27.4k
#define RRTYPE_RP_ATTRIBUTES (0)
20
21
static isc_result_t
22
3.55k
fromtext_rp(ARGS_FROMTEXT) {
23
3.55k
  isc_token_t token;
24
3.55k
  dns_name_t name;
25
3.55k
  isc_buffer_t buffer;
26
3.55k
  int i;
27
3.55k
  bool ok;
28
29
3.55k
  REQUIRE(type == dns_rdatatype_rp);
30
31
3.55k
  UNUSED(type);
32
3.55k
  UNUSED(rdclass);
33
3.55k
  UNUSED(callbacks);
34
35
3.55k
  if (origin == NULL) {
36
5
    origin = dns_rootname;
37
5
  }
38
39
10.6k
  for (i = 0; i < 2; i++) {
40
7.09k
    RETERR(isc_lex_getmastertoken(lexer, &token,
41
7.09k
                isc_tokentype_string, false));
42
7.08k
    dns_name_init(&name, NULL);
43
7.08k
    buffer_fromregion(&buffer, &token.value.as_region);
44
7.08k
    RETTOK(dns_name_fromtext(&name, &buffer, origin, options,
45
7.08k
           target));
46
7.08k
    ok = true;
47
7.08k
    if ((options & DNS_RDATA_CHECKNAMES) != 0 && i == 0) {
48
0
      ok = dns_name_ismailbox(&name);
49
0
    }
50
7.08k
    if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) {
51
0
      RETTOK(DNS_R_BADNAME);
52
0
    }
53
7.08k
    if (!ok && callbacks != NULL) {
54
0
      warn_badname(&name, lexer, callbacks);
55
0
    }
56
7.08k
  }
57
3.53k
  return (ISC_R_SUCCESS);
58
3.55k
}
59
60
static isc_result_t
61
4.42k
totext_rp(ARGS_TOTEXT) {
62
4.42k
  isc_region_t region;
63
4.42k
  dns_name_t rmail;
64
4.42k
  dns_name_t email;
65
4.42k
  dns_name_t prefix;
66
4.42k
  bool sub;
67
68
4.42k
  REQUIRE(rdata->type == dns_rdatatype_rp);
69
4.42k
  REQUIRE(rdata->length != 0);
70
71
4.42k
  dns_name_init(&rmail, NULL);
72
4.42k
  dns_name_init(&email, NULL);
73
4.42k
  dns_name_init(&prefix, NULL);
74
75
4.42k
  dns_rdata_toregion(rdata, &region);
76
77
4.42k
  dns_name_fromregion(&rmail, &region);
78
4.42k
  isc_region_consume(&region, rmail.length);
79
80
4.42k
  dns_name_fromregion(&email, &region);
81
4.42k
  isc_region_consume(&region, email.length);
82
83
4.42k
  sub = name_prefix(&rmail, tctx->origin, &prefix);
84
4.42k
  RETERR(dns_name_totext(&prefix, sub, target));
85
86
4.42k
  RETERR(str_totext(" ", target));
87
88
4.42k
  sub = name_prefix(&email, tctx->origin, &prefix);
89
4.42k
  return (dns_name_totext(&prefix, sub, target));
90
4.42k
}
91
92
static isc_result_t
93
6.81k
fromwire_rp(ARGS_FROMWIRE) {
94
6.81k
  dns_name_t rmail;
95
6.81k
  dns_name_t email;
96
97
6.81k
  REQUIRE(type == dns_rdatatype_rp);
98
99
6.81k
  UNUSED(type);
100
6.81k
  UNUSED(rdclass);
101
102
6.81k
  dctx = dns_decompress_setpermitted(dctx, false);
103
104
6.81k
  dns_name_init(&rmail, NULL);
105
6.81k
  dns_name_init(&email, NULL);
106
107
6.81k
  RETERR(dns_name_fromwire(&rmail, source, dctx, target));
108
6.39k
  return (dns_name_fromwire(&email, source, dctx, target));
109
6.81k
}
110
111
static isc_result_t
112
640
towire_rp(ARGS_TOWIRE) {
113
640
  isc_region_t region;
114
640
  dns_name_t rmail;
115
640
  dns_name_t email;
116
640
  dns_offsets_t roffsets;
117
640
  dns_offsets_t eoffsets;
118
119
640
  REQUIRE(rdata->type == dns_rdatatype_rp);
120
640
  REQUIRE(rdata->length != 0);
121
122
640
  dns_compress_setpermitted(cctx, false);
123
640
  dns_name_init(&rmail, roffsets);
124
640
  dns_name_init(&email, eoffsets);
125
126
640
  dns_rdata_toregion(rdata, &region);
127
128
640
  dns_name_fromregion(&rmail, &region);
129
640
  isc_region_consume(&region, rmail.length);
130
131
640
  RETERR(dns_name_towire(&rmail, cctx, target));
132
133
639
  dns_name_fromregion(&rmail, &region);
134
639
  isc_region_consume(&region, rmail.length);
135
136
639
  return (dns_name_towire(&rmail, cctx, target));
137
640
}
138
139
static int
140
354k
compare_rp(ARGS_COMPARE) {
141
354k
  isc_region_t region1;
142
354k
  isc_region_t region2;
143
354k
  dns_name_t name1;
144
354k
  dns_name_t name2;
145
354k
  int order;
146
147
354k
  REQUIRE(rdata1->type == rdata2->type);
148
354k
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
149
354k
  REQUIRE(rdata1->type == dns_rdatatype_rp);
150
354k
  REQUIRE(rdata1->length != 0);
151
354k
  REQUIRE(rdata2->length != 0);
152
153
354k
  dns_name_init(&name1, NULL);
154
354k
  dns_name_init(&name2, NULL);
155
156
354k
  dns_rdata_toregion(rdata1, &region1);
157
354k
  dns_rdata_toregion(rdata2, &region2);
158
159
354k
  dns_name_fromregion(&name1, &region1);
160
354k
  dns_name_fromregion(&name2, &region2);
161
162
354k
  order = dns_name_rdatacompare(&name1, &name2);
163
354k
  if (order != 0) {
164
260k
    return (order);
165
260k
  }
166
167
94.1k
  isc_region_consume(&region1, name_length(&name1));
168
94.1k
  isc_region_consume(&region2, name_length(&name2));
169
170
94.1k
  dns_name_init(&name1, NULL);
171
94.1k
  dns_name_init(&name2, NULL);
172
173
94.1k
  dns_name_fromregion(&name1, &region1);
174
94.1k
  dns_name_fromregion(&name2, &region2);
175
176
94.1k
  return (dns_name_rdatacompare(&name1, &name2));
177
354k
}
178
179
static isc_result_t
180
0
fromstruct_rp(ARGS_FROMSTRUCT) {
181
0
  dns_rdata_rp_t *rp = source;
182
0
  isc_region_t region;
183
184
0
  REQUIRE(type == dns_rdatatype_rp);
185
0
  REQUIRE(rp != NULL);
186
0
  REQUIRE(rp->common.rdtype == type);
187
0
  REQUIRE(rp->common.rdclass == rdclass);
188
189
0
  UNUSED(type);
190
0
  UNUSED(rdclass);
191
192
0
  dns_name_toregion(&rp->mail, &region);
193
0
  RETERR(isc_buffer_copyregion(target, &region));
194
0
  dns_name_toregion(&rp->text, &region);
195
0
  return (isc_buffer_copyregion(target, &region));
196
0
}
197
198
static isc_result_t
199
0
tostruct_rp(ARGS_TOSTRUCT) {
200
0
  isc_region_t region;
201
0
  dns_rdata_rp_t *rp = target;
202
0
  dns_name_t name;
203
204
0
  REQUIRE(rdata->type == dns_rdatatype_rp);
205
0
  REQUIRE(rp != NULL);
206
0
  REQUIRE(rdata->length != 0);
207
208
0
  rp->common.rdclass = rdata->rdclass;
209
0
  rp->common.rdtype = rdata->type;
210
0
  ISC_LINK_INIT(&rp->common, link);
211
212
0
  dns_name_init(&name, NULL);
213
0
  dns_rdata_toregion(rdata, &region);
214
0
  dns_name_fromregion(&name, &region);
215
0
  dns_name_init(&rp->mail, NULL);
216
0
  name_duporclone(&name, mctx, &rp->mail);
217
0
  isc_region_consume(&region, name_length(&name));
218
0
  dns_name_fromregion(&name, &region);
219
0
  dns_name_init(&rp->text, NULL);
220
0
  name_duporclone(&name, mctx, &rp->text);
221
0
  rp->mctx = mctx;
222
0
  return (ISC_R_SUCCESS);
223
0
}
224
225
static void
226
0
freestruct_rp(ARGS_FREESTRUCT) {
227
0
  dns_rdata_rp_t *rp = source;
228
229
0
  REQUIRE(rp != NULL);
230
0
  REQUIRE(rp->common.rdtype == dns_rdatatype_rp);
231
232
0
  if (rp->mctx == NULL) {
233
0
    return;
234
0
  }
235
236
0
  dns_name_free(&rp->mail, rp->mctx);
237
0
  dns_name_free(&rp->text, rp->mctx);
238
0
  rp->mctx = NULL;
239
0
}
240
241
static isc_result_t
242
0
additionaldata_rp(ARGS_ADDLDATA) {
243
0
  REQUIRE(rdata->type == dns_rdatatype_rp);
244
245
0
  UNUSED(rdata);
246
0
  UNUSED(owner);
247
0
  UNUSED(add);
248
0
  UNUSED(arg);
249
250
0
  return (ISC_R_SUCCESS);
251
0
}
252
253
static isc_result_t
254
0
digest_rp(ARGS_DIGEST) {
255
0
  isc_region_t r;
256
0
  dns_name_t name;
257
258
0
  REQUIRE(rdata->type == dns_rdatatype_rp);
259
260
0
  dns_rdata_toregion(rdata, &r);
261
0
  dns_name_init(&name, NULL);
262
263
0
  dns_name_fromregion(&name, &r);
264
0
  RETERR(dns_name_digest(&name, digest, arg));
265
0
  isc_region_consume(&r, name_length(&name));
266
267
0
  dns_name_init(&name, NULL);
268
0
  dns_name_fromregion(&name, &r);
269
270
0
  return (dns_name_digest(&name, digest, arg));
271
0
}
272
273
static bool
274
0
checkowner_rp(ARGS_CHECKOWNER) {
275
0
  REQUIRE(type == dns_rdatatype_rp);
276
277
0
  UNUSED(name);
278
0
  UNUSED(type);
279
0
  UNUSED(rdclass);
280
0
  UNUSED(wildcard);
281
282
0
  return (true);
283
0
}
284
285
static bool
286
0
checknames_rp(ARGS_CHECKNAMES) {
287
0
  isc_region_t region;
288
0
  dns_name_t name;
289
290
0
  REQUIRE(rdata->type == dns_rdatatype_rp);
291
292
0
  UNUSED(owner);
293
294
0
  dns_rdata_toregion(rdata, &region);
295
0
  dns_name_init(&name, NULL);
296
0
  dns_name_fromregion(&name, &region);
297
0
  if (!dns_name_ismailbox(&name)) {
298
0
    if (bad != NULL) {
299
0
      dns_name_clone(&name, bad);
300
0
    }
301
0
    return (false);
302
0
  }
303
0
  return (true);
304
0
}
305
306
static int
307
0
casecompare_rp(ARGS_COMPARE) {
308
0
  return (compare_rp(rdata1, rdata2));
309
0
}
310
#endif /* RDATA_GENERIC_RP_17_C */