Bug Summary

File:src/usr.bin/dig/lib/isc/sockaddr.c
Warning:line 137, column 2
Value stored to 'error' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name sockaddr.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.bin/dig/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/usr.bin/dig -I /usr/src/usr.bin/dig/obj -I /usr/src/usr.bin/dig/bin/dig/include -I /usr/src/usr.bin/dig/lib/dns/include -I /usr/src/usr.bin/dig/lib/isc/include -I /usr/src/usr.bin/dig/lib/isccfg/include -I /usr/src/usr.bin/dig/lib/lwres/include -D VERSION="9.10.8-P1" -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.bin/dig/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/usr.bin/dig/lib/isc/sockaddr.c
1/*
2 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
15 */
16
17/* $Id: sockaddr.c,v 1.15 2020/12/21 11:41:09 florian Exp $ */
18
19/*! \file */
20#include <sys/types.h>
21#include <sys/socket.h>
22#include <netdb.h>
23#include <stdio.h>
24
25#include <isc/buffer.h>
26
27#include <isc/region.h>
28#include <isc/sockaddr.h>
29#include <string.h>
30#include <isc/util.h>
31
32int
33isc_sockaddr_equal(const struct sockaddr_storage *a, const struct sockaddr_storage *b) {
34 return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR0x0001|
35 ISC_SOCKADDR_CMPPORT0x0002|
36 ISC_SOCKADDR_CMPSCOPE0x0004));
37}
38
39int
40isc_sockaddr_eqaddr(const struct sockaddr_storage *a, const struct sockaddr_storage *b) {
41 return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR0x0001|
42 ISC_SOCKADDR_CMPSCOPE0x0004));
43}
44
45int
46isc_sockaddr_compare(const struct sockaddr_storage *a, const struct sockaddr_storage *b,
47 unsigned int flags)
48{
49 struct sockaddr_in *sin_a, *sin_b;
50 struct sockaddr_in6 *sin6_a, *sin6_b;
51
52 REQUIRE(a != NULL && b != NULL)((void) ((a != ((void *)0) && b != ((void *)0)) || ((
isc_assertion_failed)("/usr/src/usr.bin/dig/lib/isc/sockaddr.c"
, 52, isc_assertiontype_require, "a != ((void *)0) && b != ((void *)0)"
), 0)))
;
53
54 if (a->ss_len != b->ss_len)
55 return (0);
56
57 /*
58 * We don't just memcmp because the sin_zero field isn't always
59 * zero.
60 */
61
62 if (a->ss_family != b->ss_family)
63 return (0);
64 switch (a->ss_family) {
65 case AF_INET2:
66 sin_a = (struct sockaddr_in *) a;
67 sin_b = (struct sockaddr_in *) b;
68 if ((flags & ISC_SOCKADDR_CMPADDR0x0001) != 0 &&
69 memcmp(&sin_a->sin_addr, &sin_b->sin_addr,
70 sizeof(sin_a->sin_addr)) != 0)
71 return (0);
72 if ((flags & ISC_SOCKADDR_CMPPORT0x0002) != 0 &&
73 sin_a->sin_port != sin_b->sin_port)
74 return (0);
75 break;
76 case AF_INET624:
77 sin6_a = (struct sockaddr_in6 *) a;
78 sin6_b = (struct sockaddr_in6 *) b;
79
80 if ((flags & ISC_SOCKADDR_CMPADDR0x0001) != 0 &&
81 memcmp(&sin6_a->sin6_addr, &sin6_b->sin6_addr,
82 sizeof(sin6_a->sin6_addr)) != 0)
83 return (0);
84 /*
85 * If ISC_SOCKADDR_CMPSCOPEZERO is set then don't return
86 * 0 if one of the scopes in zero.
87 */
88 if ((flags & ISC_SOCKADDR_CMPSCOPE0x0004) != 0 &&
89 sin6_a->sin6_scope_id != sin6_b->sin6_scope_id &&
90 ((flags & ISC_SOCKADDR_CMPSCOPEZERO0x0008) == 0 ||
91 (sin6_a->sin6_scope_id != 0 &&
92 sin6_b->sin6_scope_id != 0)))
93 return (0);
94 if ((flags & ISC_SOCKADDR_CMPPORT0x0002) != 0 &&
95 sin6_a->sin6_port != sin6_b->sin6_port)
96 return (0);
97 break;
98 default:
99 if (memcmp(a, b, a->ss_len) != 0)
100 return (0);
101 }
102 return (1);
103}
104
105isc_result_t
106isc_sockaddr_totext(const struct sockaddr_storage *sockaddr, isc_buffer_t *target) {
107 struct sockaddr_in *sin;
108 struct sockaddr_in6 *sin6;
109 char pbuf[sizeof("65000")];
110 unsigned int plen;
111 isc_region_t avail;
112 int error;
113 char tmp[NI_MAXHOST256];
114
115 REQUIRE(sockaddr != NULL)((void) ((sockaddr != ((void *)0)) || ((isc_assertion_failed)
("/usr/src/usr.bin/dig/lib/isc/sockaddr.c", 115, isc_assertiontype_require
, "sockaddr != ((void *)0)"), 0)))
;
116
117 /*
118 * Do the port first, giving us the opportunity to check for
119 * unsupported address families.
120 */
121 switch (sockaddr->ss_family) {
122 case AF_INET2:
123 sin = (struct sockaddr_in *)sockaddr;
124 snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sin->sin_port)(__uint16_t)(__builtin_constant_p(sin->sin_port) ? (__uint16_t
)(((__uint16_t)(sin->sin_port) & 0xffU) << 8 | (
(__uint16_t)(sin->sin_port) & 0xff00U) >> 8) : __swap16md
(sin->sin_port))
);
125 break;
126 case AF_INET624:
127 sin6 = (struct sockaddr_in6 *)sockaddr;
128 snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sin6->sin6_port)(__uint16_t)(__builtin_constant_p(sin6->sin6_port) ? (__uint16_t
)(((__uint16_t)(sin6->sin6_port) & 0xffU) << 8 |
((__uint16_t)(sin6->sin6_port) & 0xff00U) >> 8)
: __swap16md(sin6->sin6_port))
);
129 break;
130 default:
131 return (ISC_R_FAILURE25);
132 }
133
134 plen = strlen(pbuf);
135 INSIST(plen < sizeof(pbuf))((void) ((plen < sizeof(pbuf)) || ((isc_assertion_failed)(
"/usr/src/usr.bin/dig/lib/isc/sockaddr.c", 135, isc_assertiontype_insist
, "plen < sizeof(pbuf)"), 0)))
;
136
137 error = getnameinfo((struct sockaddr *)sockaddr, sockaddr->ss_len,
Value stored to 'error' is never read
138 tmp, sizeof(tmp), NULL((void *)0), 0, NI_NUMERICHOST1 | NI_NUMERICSERV2);
139 if (strlen(tmp) > isc_buffer_availablelength(target)((target)->length - (target)->used))
140 return (ISC_R_NOSPACE19);
141 isc_buffer_putmemisc__buffer_putmem(target, tmp, strlen(tmp));
142
143 if (1 + plen + 1 > isc_buffer_availablelength(target)((target)->length - (target)->used))
144 return (ISC_R_NOSPACE19);
145
146 isc_buffer_putmemisc__buffer_putmem(target, (const unsigned char *)"#", 1);
147 isc_buffer_putmemisc__buffer_putmem(target, (const unsigned char *)pbuf, plen);
148
149 /*
150 * Null terminate after used region.
151 */
152 isc_buffer_availableregionisc__buffer_availableregion(target, &avail);
153 INSIST(avail.length >= 1)((void) ((avail.length >= 1) || ((isc_assertion_failed)("/usr/src/usr.bin/dig/lib/isc/sockaddr.c"
, 153, isc_assertiontype_insist, "avail.length >= 1"), 0))
)
;
154 avail.base[0] = '\0';
155
156 return (ISC_R_SUCCESS0);
157}
158
159void
160isc_sockaddr_format(const struct sockaddr_storage *sa, char *array, unsigned int size) {
161 isc_result_t result;
162 isc_buffer_t buf;
163
164 if (size == 0U)
165 return;
166
167 isc_buffer_initisc__buffer_init(&buf, array, size);
168 result = isc_sockaddr_totext(sa, &buf);
169 if (result != ISC_R_SUCCESS0) {
170 snprintf(array, size, "<unknown address, family %u>",
171 sa->ss_family);
172 array[size - 1] = '\0';
173 }
174}
175
176void
177isc_sockaddr_any(struct sockaddr_storage *sockaddr)
178{
179 struct sockaddr_in *sin = (struct sockaddr_in *) sockaddr;
180 memset(sockaddr, 0, sizeof(*sockaddr));
181 sin->sin_family = AF_INET2;
182 sin->sin_len = sizeof(*sin);
183 sin->sin_addr.s_addr = INADDR_ANY((u_int32_t)(0x00000000));
184 sin->sin_port = 0;
185}
186
187void
188isc_sockaddr_any6(struct sockaddr_storage *sockaddr)
189{
190 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sockaddr;
191 memset(sockaddr, 0, sizeof(*sockaddr));
192 sin6->sin6_family = AF_INET624;
193 sin6->sin6_len = sizeof(*sin6);
194 sin6->sin6_addr = in6addr_any;
195 sin6->sin6_port = 0;
196}
197
198void
199isc_sockaddr_anyofpf(struct sockaddr_storage *sockaddr, int pf) {
200 switch (pf) {
201 case AF_INET2:
202 isc_sockaddr_any(sockaddr);
203 break;
204 case AF_INET624:
205 isc_sockaddr_any6(sockaddr);
206 break;
207 default:
208 INSIST(0)((void) ((0) || ((isc_assertion_failed)("/usr/src/usr.bin/dig/lib/isc/sockaddr.c"
, 208, isc_assertiontype_insist, "0"), 0)))
;
209 }
210}
211
212int
213isc_sockaddr_pf(const struct sockaddr_storage *sockaddr) {
214
215 /*
216 * Get the protocol family of 'sockaddr'.
217 */
218
219 return (sockaddr->ss_family);
220}
221
222in_port_t
223isc_sockaddr_getport(const struct sockaddr_storage *sockaddr) {
224 struct sockaddr_in *sin;
225 struct sockaddr_in6 *sin6;
226
227 switch (sockaddr->ss_family) {
228 case AF_INET2:
229 sin = (struct sockaddr_in *)sockaddr;
230 return (ntohs(sin->sin_port)(__uint16_t)(__builtin_constant_p(sin->sin_port) ? (__uint16_t
)(((__uint16_t)(sin->sin_port) & 0xffU) << 8 | (
(__uint16_t)(sin->sin_port) & 0xff00U) >> 8) : __swap16md
(sin->sin_port))
);
231 break;
232 case AF_INET624:
233 sin6 = (struct sockaddr_in6 *)sockaddr;
234 return (ntohs(sin6->sin6_port)(__uint16_t)(__builtin_constant_p(sin6->sin6_port) ? (__uint16_t
)(((__uint16_t)(sin6->sin6_port) & 0xffU) << 8 |
((__uint16_t)(sin6->sin6_port) & 0xff00U) >> 8)
: __swap16md(sin6->sin6_port))
);
235 break;
236 default:
237 FATAL_ERRORisc_error_fatal(__FILE__"/usr/src/usr.bin/dig/lib/isc/sockaddr.c", __LINE__237,
238 "unknown address family: %d",
239 (int)sockaddr->ss_family);
240 }
241}
242
243int
244isc_sockaddr_ismulticast(const struct sockaddr_storage *sockaddr) {
245 struct sockaddr_in *sin;
246 struct sockaddr_in6 *sin6;
247
248 switch (sockaddr->ss_family) {
249 case AF_INET2:
250 sin = (struct sockaddr_in *)sockaddr;
251 return (IN_MULTICAST(sin->sin_addr.s_addr)(((u_int32_t)(sin->sin_addr.s_addr) & ((u_int32_t)(0xf0000000
))) == ((u_int32_t)(0xe0000000)))
);
252 case AF_INET624:
253 sin6 = (struct sockaddr_in6 *)sockaddr;
254 return (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)((&sin6->sin6_addr)->__u6_addr.__u6_addr8[0] == 0xff
)
);
255 default:
256 return (0);
257 }
258}
259
260int
261isc_sockaddr_issitelocal(const struct sockaddr_storage *sockaddr) {
262 struct sockaddr_in6 *sin6;
263 if (sockaddr->ss_family == AF_INET624) {
264 sin6 = (struct sockaddr_in6 *)sockaddr;
265 return (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)(((&sin6->sin6_addr)->__u6_addr.__u6_addr8[0] == 0xfe
) && (((&sin6->sin6_addr)->__u6_addr.__u6_addr8
[1] & 0xc0) == 0xc0))
);
266 }
267 return (0);
268}
269
270int
271isc_sockaddr_islinklocal(const struct sockaddr_storage *sockaddr) {
272 struct sockaddr_in6 *sin6;
273 if (sockaddr->ss_family == AF_INET624) {
274 sin6 = (struct sockaddr_in6 *)sockaddr;
275 return (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)(((&sin6->sin6_addr)->__u6_addr.__u6_addr8[0] == 0xfe
) && (((&sin6->sin6_addr)->__u6_addr.__u6_addr8
[1] & 0xc0) == 0x80))
);
276 }
277 return (0);
278}