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/lp_107.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_LP_107_C
15
#define RDATA_GENERIC_LP_107_C
16
17
#include <string.h>
18
19
#include <isc/net.h>
20
21
8.77k
#define RRTYPE_LP_ATTRIBUTES (0)
22
23
static isc_result_t
24
1.09k
fromtext_lp(ARGS_FROMTEXT) {
25
1.09k
  isc_token_t token;
26
1.09k
  isc_buffer_t buffer;
27
28
1.09k
  REQUIRE(type == dns_rdatatype_lp);
29
30
1.09k
  UNUSED(type);
31
1.09k
  UNUSED(rdclass);
32
1.09k
  UNUSED(callbacks);
33
34
1.09k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
35
1.09k
              false));
36
1.08k
  if (token.value.as_ulong > 0xffffU) {
37
10
    RETTOK(ISC_R_RANGE);
38
10
  }
39
1.07k
  RETERR(uint16_tobuffer(token.value.as_ulong, target));
40
41
1.07k
  RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
42
1.07k
              false));
43
44
1.04k
  buffer_fromregion(&buffer, &token.value.as_region);
45
1.04k
  if (origin == NULL) {
46
1
    origin = dns_rootname;
47
1
  }
48
1.04k
  return dns_name_wirefromtext(&buffer, origin, options, target);
49
1.07k
}
50
51
static isc_result_t
52
842
totext_lp(ARGS_TOTEXT) {
53
842
  isc_region_t region;
54
842
  dns_name_t name;
55
842
  dns_name_t prefix;
56
842
  unsigned int opts;
57
842
  char buf[sizeof("64000")];
58
842
  unsigned short num;
59
60
842
  REQUIRE(rdata->type == dns_rdatatype_lp);
61
842
  REQUIRE(rdata->length != 0);
62
63
842
  dns_name_init(&name);
64
842
  dns_name_init(&prefix);
65
66
842
  dns_rdata_toregion(rdata, &region);
67
842
  num = uint16_fromregion(&region);
68
842
  isc_region_consume(&region, 2);
69
842
  snprintf(buf, sizeof(buf), "%u", num);
70
842
  RETERR(str_totext(buf, target));
71
72
842
  RETERR(str_totext(" ", target));
73
74
842
  dns_name_fromregion(&name, &region);
75
842
  opts = name_prefix(&name, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT
76
842
               : 0;
77
842
  return dns_name_totext(&prefix, opts, target);
78
842
}
79
80
static isc_result_t
81
961
fromwire_lp(ARGS_FROMWIRE) {
82
961
  dns_name_t name;
83
961
  isc_region_t sregion;
84
85
961
  REQUIRE(type == dns_rdatatype_lp);
86
87
961
  UNUSED(type);
88
961
  UNUSED(rdclass);
89
90
961
  dctx = dns_decompress_setpermitted(dctx, true);
91
92
961
  dns_name_init(&name);
93
94
961
  isc_buffer_activeregion(source, &sregion);
95
961
  if (sregion.length < 2) {
96
9
    return ISC_R_UNEXPECTEDEND;
97
9
  }
98
952
  RETERR(mem_tobuffer(target, sregion.base, 2));
99
886
  isc_buffer_forward(source, 2);
100
886
  return dns_name_fromwire(&name, source, dctx, target);
101
952
}
102
103
static isc_result_t
104
424
towire_lp(ARGS_TOWIRE) {
105
424
  REQUIRE(rdata->type == dns_rdatatype_lp);
106
424
  REQUIRE(rdata->length != 0);
107
108
424
  UNUSED(cctx);
109
110
424
  return mem_tobuffer(target, rdata->data, rdata->length);
111
424
}
112
113
static int
114
32.6k
compare_lp(ARGS_COMPARE) {
115
32.6k
  isc_region_t region1;
116
32.6k
  isc_region_t region2;
117
118
32.6k
  REQUIRE(rdata1->type == rdata2->type);
119
32.6k
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
120
32.6k
  REQUIRE(rdata1->type == dns_rdatatype_lp);
121
32.6k
  REQUIRE(rdata1->length != 0);
122
32.6k
  REQUIRE(rdata2->length != 0);
123
124
32.6k
  dns_rdata_toregion(rdata1, &region1);
125
32.6k
  dns_rdata_toregion(rdata2, &region2);
126
127
32.6k
  return isc_region_compare(&region1, &region2);
128
32.6k
}
129
130
static isc_result_t
131
0
fromstruct_lp(ARGS_FROMSTRUCT) {
132
0
  dns_rdata_lp_t *lp = source;
133
0
  isc_region_t region;
134
135
0
  REQUIRE(type == dns_rdatatype_lp);
136
0
  REQUIRE(lp != NULL);
137
0
  REQUIRE(lp->common.rdtype == type);
138
0
  REQUIRE(lp->common.rdclass == rdclass);
139
140
0
  UNUSED(type);
141
0
  UNUSED(rdclass);
142
143
0
  RETERR(uint16_tobuffer(lp->pref, target));
144
0
  dns_name_toregion(&lp->lp, &region);
145
0
  return isc_buffer_copyregion(target, &region);
146
0
}
147
148
static isc_result_t
149
0
tostruct_lp(ARGS_TOSTRUCT) {
150
0
  isc_region_t region;
151
0
  dns_rdata_lp_t *lp = target;
152
0
  dns_name_t name;
153
154
0
  REQUIRE(rdata->type == dns_rdatatype_lp);
155
0
  REQUIRE(lp != NULL);
156
0
  REQUIRE(rdata->length != 0);
157
158
0
  DNS_RDATACOMMON_INIT(lp, rdata->type, rdata->rdclass);
159
160
0
  dns_name_init(&name);
161
0
  dns_rdata_toregion(rdata, &region);
162
0
  lp->pref = uint16_fromregion(&region);
163
0
  isc_region_consume(&region, 2);
164
0
  dns_name_fromregion(&name, &region);
165
0
  dns_name_init(&lp->lp);
166
0
  name_duporclone(&name, mctx, &lp->lp);
167
0
  lp->mctx = mctx;
168
0
  return ISC_R_SUCCESS;
169
0
}
170
171
static void
172
0
freestruct_lp(ARGS_FREESTRUCT) {
173
0
  dns_rdata_lp_t *lp = source;
174
175
0
  REQUIRE(lp != NULL);
176
0
  REQUIRE(lp->common.rdtype == dns_rdatatype_lp);
177
178
0
  if (lp->mctx == NULL) {
179
0
    return;
180
0
  }
181
182
0
  dns_name_free(&lp->lp, lp->mctx);
183
0
  lp->mctx = NULL;
184
0
}
185
186
static isc_result_t
187
0
additionaldata_lp(ARGS_ADDLDATA) {
188
0
  dns_name_t name;
189
0
  isc_region_t region;
190
191
0
  REQUIRE(rdata->type == dns_rdatatype_lp);
192
193
0
  UNUSED(owner);
194
195
0
  dns_name_init(&name);
196
0
  dns_rdata_toregion(rdata, &region);
197
0
  isc_region_consume(&region, 2);
198
0
  dns_name_fromregion(&name, &region);
199
200
0
  RETERR((add)(arg, &name, dns_rdatatype_l32, NULL DNS__DB_FILELINE));
201
0
  return (add)(arg, &name, dns_rdatatype_l64, NULL DNS__DB_FILELINE);
202
0
}
203
204
static isc_result_t
205
0
digest_lp(ARGS_DIGEST) {
206
0
  isc_region_t region;
207
208
0
  REQUIRE(rdata->type == dns_rdatatype_lp);
209
210
0
  dns_rdata_toregion(rdata, &region);
211
0
  return (digest)(arg, &region);
212
0
}
213
214
static bool
215
0
checkowner_lp(ARGS_CHECKOWNER) {
216
0
  REQUIRE(type == dns_rdatatype_lp);
217
218
0
  UNUSED(type);
219
0
  UNUSED(rdclass);
220
0
  UNUSED(name);
221
0
  UNUSED(wildcard);
222
223
0
  return true;
224
0
}
225
226
static bool
227
0
checknames_lp(ARGS_CHECKNAMES) {
228
0
  REQUIRE(rdata->type == dns_rdatatype_lp);
229
230
0
  UNUSED(bad);
231
0
  UNUSED(owner);
232
233
0
  return true;
234
0
}
235
236
static int
237
0
casecompare_lp(ARGS_COMPARE) {
238
0
  dns_name_t name1;
239
0
  dns_name_t name2;
240
0
  isc_region_t region1;
241
0
  isc_region_t region2;
242
0
  int order;
243
244
0
  REQUIRE(rdata1->type == rdata2->type);
245
0
  REQUIRE(rdata1->rdclass == rdata2->rdclass);
246
0
  REQUIRE(rdata1->type == dns_rdatatype_lp);
247
0
  REQUIRE(rdata1->length != 0);
248
0
  REQUIRE(rdata2->length != 0);
249
250
0
  order = memcmp(rdata1->data, rdata2->data, 2);
251
0
  if (order != 0) {
252
0
    return order < 0 ? -1 : 1;
253
0
  }
254
255
0
  dns_name_init(&name1);
256
0
  dns_name_init(&name2);
257
258
0
  dns_rdata_toregion(rdata1, &region1);
259
0
  dns_rdata_toregion(rdata2, &region2);
260
261
0
  isc_region_consume(&region1, 2);
262
0
  isc_region_consume(&region2, 2);
263
264
0
  dns_name_fromregion(&name1, &region1);
265
0
  dns_name_fromregion(&name2, &region2);
266
267
0
  return dns_name_rdatacompare(&name1, &name2);
268
0
}
269
270
#endif /* RDATA_GENERIC_LP_107_C */