Bug Summary

File:src/usr.sbin/mopd/moptrace/../common/device.c
Warning:line 161, column 2
Value stored to 'p' 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 device.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.sbin/mopd/moptrace/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/usr.sbin/mopd/moptrace -I /usr/src/usr.sbin/mopd/moptrace/.. -I /usr/src/usr.sbin/mopd/moptrace/../common -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.sbin/mopd/moptrace/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.sbin/mopd/moptrace/../common/device.c
1/* $OpenBSD: device.c,v 1.18 2021/01/26 18:25:07 deraadt Exp $ */
2
3/*
4 * Copyright (c) 1993-95 Mats O Jansson. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "os.h"
28#include "common.h"
29#include "device.h"
30#include "mopdef.h"
31#include "pf.h"
32
33extern struct if_info *iflist; /* Interface List */
34
35#ifdef DEV_NEW_CONF
36/*
37 * Return ethernet address for interface
38 */
39
40void
41deviceEthAddr(char *ifname, u_char *eaddr)
42{
43 struct sockaddr_dl *sdl;
44 struct ifaddrs *ifap, *ifa;
45
46 if (getifaddrs(&ifap) != 0) {
47 syslog(LOG_ERR3, "deviceEthAddr: getifaddrs: %m");
48 exit(1);
49 }
50
51 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
52 sdl = (struct sockaddr_dl *)ifa->ifa_addr;
53 if (sdl->sdl_family != AF_LINK18 || sdl->sdl_type != IFT_ETHER0x06 ||
54 sdl->sdl_alen != 6)
55 continue;
56 if (!strcmp(ifa->ifa_name, ifname)) {
57 bcopy(LLADDR(sdl)((caddr_t)((sdl)->sdl_data + (sdl)->sdl_nlen)), eaddr, 6);
58 freeifaddrs(ifap);
59 return;
60 }
61 }
62
63 syslog(LOG_ERR3, "deviceEthAddr: Never saw interface `%s'!", ifname);
64 exit(1);
65}
66#endif /* DEV_NEW_CONF */
67
68void
69deviceOpen(char *ifname, u_short proto, int trans)
70{
71 struct if_info *p, tmp;
72
73 strncpy(tmp.if_name, ifname, sizeof(tmp.if_name) - 1);
74 tmp.if_name[sizeof(tmp.if_name) - 1] = 0;
75 tmp.iopen = pfInit;
76
77 switch (proto) {
78 case MOP_K_PROTO_RC0x6002:
79 tmp.read = mopReadRC;
80 tmp.fd = mopOpenRC(&tmp, trans);
81 break;
82 case MOP_K_PROTO_DL0x6001:
83 tmp.read = mopReadDL;
84 tmp.fd = mopOpenDL(&tmp, trans);
85 break;
86 default:
87 break;
88 }
89
90 if (tmp.fd != -1) {
91 p = malloc(sizeof(*p));
92 if (p == 0) {
93 syslog(LOG_ERR3, "deviceOpen: malloc: %m");
94 exit(1);
95 }
96
97 p->next = iflist;
98 iflist = p;
99
100 strlcpy(p->if_name, tmp.if_name, IFNAME_SIZE32);
101 p->iopen = tmp.iopen;
102 p->write = pfWrite;
103 p->read = tmp.read;
104 bzero(p->eaddr, sizeof(p->eaddr));
105 p->fd = tmp.fd;
106
107#ifdef DEV_NEW_CONF
108 deviceEthAddr(p->if_name, &p->eaddr[0]);
109#else
110 p->eaddr[0] = tmp.eaddr[0];
111 p->eaddr[1] = tmp.eaddr[1];
112 p->eaddr[2] = tmp.eaddr[2];
113 p->eaddr[3] = tmp.eaddr[3];
114 p->eaddr[4] = tmp.eaddr[4];
115 p->eaddr[5] = tmp.eaddr[5];
116#endif /* DEV_NEW_CONF */
117
118#ifdef LINUX2_PF
119 {
120 int s;
121
122 s = socket(AF_INET2, SOCK_DGRAM2, 0);
123 pfEthAddr(s, p->if_name, &p->eaddr[0]);
124 close(s);
125 }
126#endif
127 }
128}
129
130void
131deviceInitOne(char *ifname)
132{
133 char interface[IFNAME_SIZE32];
134 struct if_info *p;
135 int trans;
136#ifdef _AIX
137 char dev[IFNAME_SIZE32];
138 int unit,j;
139
140 unit = 0;
141 for (j = 0; j < strlen(ifname); j++) {
142 if (isalpha((unsigned char)ifname[j]))
143 dev[j] = ifname[j];
144 else
145 if (isdigit((unsigned char)ifname[j])) {
146 unit = unit * 10 + ifname[j] - '0';
147 dev[j] = '\0';
148 }
149 }
150
151 if ((strlen(dev) == 2) && (dev[0] == 'e') &&
152 ((dev[1] == 'n') || (dev[1] == 't')))
153 snprintf(interface, sizeof(interface), "ent%d\0", unit);
154 else
155 snprintf(interface, sizeof(interface), "%s%d\0", dev, unit);
156#else
157 snprintf(interface, sizeof(interface), "%s", ifname);
158#endif /* _AIX */
159
160 /* Ok, init it just once */
161 p = iflist;
Value stored to 'p' is never read
162 for (p = iflist; p; p = p->next)
163 if (strcmp(p->if_name, interface) == 0)
164 return;
165
166 syslog(LOG_INFO6, "Initialized %s", interface);
167
168 /* Ok, get transport information */
169 trans = pfTrans(interface);
170
171#ifndef NORC
172 /* Start with MOP Remote Console */
173 switch (trans) {
174 case TRANS_ETHER1:
175 deviceOpen(interface, MOP_K_PROTO_RC0x6002, TRANS_ETHER1);
176 break;
177 case TRANS_80232:
178 deviceOpen(interface, MOP_K_PROTO_RC0x6002, TRANS_80232);
179 break;
180 case TRANS_ETHER1 + TRANS_80232:
181 deviceOpen(interface, MOP_K_PROTO_RC0x6002, TRANS_ETHER1);
182 deviceOpen(interface, MOP_K_PROTO_RC0x6002, TRANS_80232);
183 break;
184 case TRANS_ETHER1 + TRANS_80232 + TRANS_AND0x1000:
185 deviceOpen(interface, MOP_K_PROTO_RC0x6002, TRANS_ETHER1 + TRANS_80232);
186 break;
187 }
188#endif
189
190#ifndef NODL
191 /* and next MOP Dump/Load */
192 switch (trans) {
193 case TRANS_ETHER1:
194 deviceOpen(interface, MOP_K_PROTO_DL0x6001, TRANS_ETHER1);
195 break;
196 case TRANS_80232:
197 deviceOpen(interface, MOP_K_PROTO_DL0x6001, TRANS_80232);
198 break;
199 case TRANS_ETHER1 + TRANS_80232:
200 deviceOpen(interface, MOP_K_PROTO_DL0x6001, TRANS_ETHER1);
201 deviceOpen(interface, MOP_K_PROTO_DL0x6001, TRANS_80232);
202 break;
203 case TRANS_ETHER1 + TRANS_80232 + TRANS_AND0x1000:
204 deviceOpen(interface, MOP_K_PROTO_DL0x6001, TRANS_ETHER1 + TRANS_80232);
205 break;
206 }
207#endif
208
209}
210
211/*
212 * Initialize all "candidate" interfaces that are in the system
213 * configuration list. A "candidate" is up, not loopback and not
214 * point to point.
215 */
216void
217deviceInitAll()
218{
219#ifdef DEV_NEW_CONF
220 struct sockaddr_dl *sdl;
221 struct ifaddrs *ifap, *ifa;
222
223 if (getifaddrs(&ifap) != 0) {
224 syslog(LOG_ERR3, "deviceInitAll: getifaddrs: %m");
225 exit(1);
226 }
227
228 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
229 sdl = (struct sockaddr_dl *)ifa->ifa_addr;
230 if (sdl->sdl_family != AF_LINK18 || sdl->sdl_type != IFT_ETHER0x06 ||
231 sdl->sdl_alen != 6)
232 continue;
233 if ((ifa->ifa_flags &
234 (IFF_UP0x1 | IFF_LOOPBACK0x8 | IFF_POINTOPOINT0x10)) != IFF_UP0x1)
235 continue;
236 deviceInitOne(ifa->ifa_name);
237 }
238 freeifaddrs(ifap);
239#else
240 struct ifaddrs *ifap, *ifa;
241
242 if (getifaddrs(&ifap) != 0) {
243 syslog(LOG_ERR3, "deviceInitAll: getifaddrs: %m");
244 exit(1);
245 }
246
247 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
248 if (/*(ifa->ifa_flags & IFF_UP) == 0 ||*/
249 ifa->ifa_flags & IFF_LOOPBACK0x8 ||
250 ifa->ifa_flags & IFF_POINTOPOINT0x10)
251 continue;
252 deviceInitOne(ifa->ifa_name);
253 }
254 freeifaddrs(ifap);
255#endif
256}