Coverage Report

Created: 2026-01-17 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libpcap/nametoaddr.c
Line
Count
Source
1
/*
2
 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
3
 *  The Regents of the University of California.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that: (1) source code distributions
7
 * retain the above copyright notice and this paragraph in its entirety, (2)
8
 * distributions including binary code include the above copyright notice and
9
 * this paragraph in its entirety in the documentation or other materials
10
 * provided with the distribution, and (3) all advertising materials mentioning
11
 * features or use of this software display the following acknowledgement:
12
 * ``This product includes software developed by the University of California,
13
 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14
 * the University nor the names of its contributors may be used to endorse
15
 * or promote products derived from this software without specific prior
16
 * written permission.
17
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20
 *
21
 * Name to id translation routines used by the scanner.
22
 * These functions are not time critical.
23
 */
24
25
#include <config.h>
26
27
#ifdef _WIN32
28
  #include <winsock2.h>
29
  #include <ws2tcpip.h>
30
#else /* _WIN32 */
31
  #include <sys/param.h>
32
  #include <sys/types.h>
33
  #include <sys/socket.h>
34
  #include <sys/time.h>
35
36
  #include <netinet/in.h>
37
38
  #if defined(__linux__) && defined(HAVE_ETHER_HOSTTON)
39
    #include <features.h>
40
    #if ! defined(__GLIBC__) && ! defined(__UCLIBC__)
41
      /*
42
       * In musl libc (which does not identify itself) ether_hostton() is
43
       * present and does not work.
44
       */
45
      #undef HAVE_ETHER_HOSTTON
46
    #endif
47
  #endif // defined(__linux__) && defined(HAVE_ETHER_HOSTTON)
48
49
  #ifdef HAVE_ETHER_HOSTTON
50
    #if defined(NET_ETHERNET_H_DECLARES_ETHER_HOSTTON)
51
      /*
52
       * OK, just include <net/ethernet.h>.
53
       */
54
      #include <net/ethernet.h>
55
    #elif defined(NETINET_ETHER_H_DECLARES_ETHER_HOSTTON)
56
      /*
57
       * OK, just include <netinet/ether.h>
58
       */
59
      #include <netinet/ether.h>
60
    #elif defined(SYS_ETHERNET_H_DECLARES_ETHER_HOSTTON)
61
      /*
62
       * OK, just include <sys/ethernet.h>
63
       */
64
      #include <sys/ethernet.h>
65
    #elif defined(ARPA_INET_H_DECLARES_ETHER_HOSTTON)
66
      /*
67
       * OK, just include <arpa/inet.h>
68
       */
69
      #include <arpa/inet.h>
70
    #elif defined(NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON)
71
      /*
72
       * OK, include <netinet/if_ether.h>, after all the other stuff we
73
       * need to include or define for its benefit.
74
       */
75
      #define NEED_NETINET_IF_ETHER_H
76
    #else
77
      /*
78
       * We'll have to declare it ourselves.
79
       * If <netinet/if_ether.h> defines struct ether_addr, include
80
       * it.  Otherwise, define it ourselves.
81
       */
82
      #ifdef HAVE_STRUCT_ETHER_ADDR
83
        #define NEED_NETINET_IF_ETHER_H
84
      #else /* HAVE_STRUCT_ETHER_ADDR */
85
  struct ether_addr {
86
    unsigned char ether_addr_octet[6];
87
  };
88
      #endif /* HAVE_STRUCT_ETHER_ADDR */
89
    #endif /* what declares ether_hostton() */
90
91
    #ifdef NEED_NETINET_IF_ETHER_H
92
      #include <net/if.h> /* Needed on some platforms */
93
      #include <netinet/in.h> /* Needed on some platforms */
94
      #include <netinet/if_ether.h>
95
    #endif /* NEED_NETINET_IF_ETHER_H */
96
97
    #ifndef HAVE_DECL_ETHER_HOSTTON
98
      /*
99
       * No header declares it, so declare it ourselves.
100
       */
101
      extern int ether_hostton(const char *, struct ether_addr *);
102
    #endif /* !defined(HAVE_DECL_ETHER_HOSTTON) */
103
  #endif /* HAVE_ETHER_HOSTTON */
104
105
  #include <arpa/inet.h>
106
  #include <netdb.h>
107
#endif /* _WIN32 */
108
109
#include <errno.h>
110
#include <stdlib.h>
111
#include <string.h>
112
#include <stdio.h>
113
114
#include "pcap-int.h"
115
116
#include "diag-control.h"
117
118
#include "gencode.h"
119
#include <pcap/namedb.h>
120
#include "nametoaddr.h"
121
122
#include "thread-local.h"
123
124
#ifdef HAVE_OS_PROTO_H
125
#include "os-proto.h"
126
#endif
127
128
#ifndef NTOHL
129
0
#define NTOHL(x) (x) = ntohl(x)
130
#endif
131
132
/*
133
 *  Convert host name to internet address.
134
 *  Return 0 upon failure.
135
 *  XXX - not thread-safe; don't use it inside libpcap.
136
 */
137
bpf_u_int32 **
138
pcap_nametoaddr(const char *name)
139
0
{
140
#ifndef h_addr
141
  static bpf_u_int32 *hlist[2];
142
#endif
143
0
  bpf_u_int32 **p;
144
0
  struct hostent *hp;
145
146
  /*
147
   * gethostbyname() is deprecated on Windows, perhaps because
148
   * it's not thread-safe, or because it doesn't support IPv6,
149
   * or both.
150
   *
151
   * We deprecate pcap_nametoaddr() on all platforms because
152
   * it's not thread-safe; we supply it for backwards compatibility,
153
   * so suppress the deprecation warning.  We could, I guess,
154
   * use getaddrinfo() and construct the array ourselves, but
155
   * that's probably not worth the effort, as that wouldn't make
156
   * this thread-safe - we can't change the API to require that
157
   * our caller free the address array, so we still have to reuse
158
   * a local array.
159
   */
160
0
DIAG_OFF_DEPRECATION
161
0
  if ((hp = gethostbyname(name)) != NULL) {
162
0
DIAG_ON_DEPRECATION
163
#ifndef h_addr
164
    hlist[0] = (bpf_u_int32 *)hp->h_addr;
165
    NTOHL(hp->h_addr);
166
    return hlist;
167
#else
168
0
    for (p = (bpf_u_int32 **)hp->h_addr_list; *p; ++p)
169
0
      NTOHL(**p);
170
0
    return (bpf_u_int32 **)hp->h_addr_list;
171
0
#endif
172
0
  }
173
0
  else
174
0
    return 0;
175
0
}
176
177
struct addrinfo *
178
pcap_nametoaddrinfo(const char *name)
179
295
{
180
295
  struct addrinfo hints, *res;
181
295
  int error;
182
183
295
  memset(&hints, 0, sizeof(hints));
184
295
  hints.ai_family = PF_UNSPEC;
185
295
  hints.ai_socktype = SOCK_STREAM;  /*not really*/
186
295
  hints.ai_protocol = IPPROTO_TCP;  /*not really*/
187
295
  error = getaddrinfo(name, NULL, &hints, &res);
188
295
  if (error)
189
26
    return NULL;
190
269
  else
191
269
    return res;
192
295
}
193
194
/*
195
 *  Convert net name to internet address.
196
 *  Return 0 upon failure.
197
 *  XXX - not guaranteed to be thread-safe!  See below for platforms
198
 *  on which it is thread-safe and on which it isn't.
199
 */
200
#if defined(_WIN32) || defined(__CYGWIN__)
201
bpf_u_int32
202
pcap_nametonetaddr(const char *name _U_)
203
{
204
  /*
205
   * There's no "getnetbyname()" on Windows.
206
   *
207
   * XXX - I guess we could use the BSD code to read
208
   * C:\Windows\System32\drivers\etc/networks, assuming
209
   * that's its home on all the versions of Windows
210
   * we use, but that file probably just has the loopback
211
   * network on 127/24 on 99 44/100% of Windows machines.
212
   *
213
   * (Heck, these days it probably just has that on 99 44/100%
214
   * of *UN*X* machines.)
215
   */
216
  return 0;
217
}
218
#else /* _WIN32 */
219
bpf_u_int32
220
pcap_nametonetaddr(const char *name)
221
10
{
222
  /*
223
   * UN*X.
224
   */
225
10
  struct netent *np;
226
10
  #if defined(HAVE_LINUX_GETNETBYNAME_R)
227
  /*
228
   * We have Linux's reentrant getnetbyname_r().
229
   */
230
10
  struct netent result_buf;
231
10
  char buf[1024]; /* arbitrary size */
232
10
  int h_errnoval;
233
10
  int err;
234
235
  /*
236
   * Apparently, the man page at
237
   *
238
   *    http://man7.org/linux/man-pages/man3/getnetbyname_r.3.html
239
   *
240
   * lies when it says
241
   *
242
   *    If the function call successfully obtains a network record,
243
   *    then *result is set pointing to result_buf; otherwise, *result
244
   *    is set to NULL.
245
   *
246
   * and, in fact, at least in some versions of GNU libc, it does
247
   * *not* always get set if getnetbyname_r() succeeds.
248
   */
249
10
  np = NULL;
250
10
  err = getnetbyname_r(name, &result_buf, buf, sizeof buf, &np,
251
10
      &h_errnoval);
252
10
  if (err != 0) {
253
    /*
254
     * XXX - dynamically allocate the buffer, and make it
255
     * bigger if we get ERANGE back?
256
     */
257
0
    return 0;
258
0
  }
259
  #elif defined(HAVE_SOLARIS_GETNETBYNAME_R)
260
  /*
261
   * We have Solaris's reentrant getnetbyname_r().
262
   */
263
  struct netent result_buf;
264
  char buf[1024]; /* arbitrary size */
265
266
  np = getnetbyname_r(name, &result_buf, buf, (int)sizeof buf);
267
  #elif defined(HAVE_AIX_GETNETBYNAME_R)
268
  /*
269
   * We have AIX's reentrant getnetbyname_r().
270
   */
271
  struct netent result_buf;
272
  struct netent_data net_data;
273
274
  if (getnetbyname_r(name, &result_buf, &net_data) == -1)
275
    np = NULL;
276
  else
277
    np = &result_buf;
278
  #else
279
  /*
280
   * We don't have any getnetbyname_r(); either we have a
281
   * getnetbyname() that uses thread-specific data, in which
282
   * case we're thread-safe (sufficiently recent FreeBSD,
283
   * sufficiently recent Darwin-based OS, sufficiently recent
284
   * HP-UX, or we have the
285
   * traditional getnetbyname() (everything else, including
286
   * current NetBSD and OpenBSD), in which case we're not
287
   * thread-safe.
288
   */
289
  np = getnetbyname(name);
290
  #endif
291
10
  if (np != NULL)
292
0
    return np->n_net;
293
10
  else
294
10
    return 0;
295
10
}
296
#endif /* _WIN32 */
297
298
/*
299
 * Convert a port name to its port and protocol numbers.
300
 * We assume only TCP or UDP.
301
 * Return 0 upon failure.
302
 */
303
int
304
pcap_nametoport(const char *name, int *port, int *proto)
305
622
{
306
622
  struct addrinfo hints, *res, *ai;
307
622
  int error;
308
622
  struct sockaddr_in *in4;
309
622
  struct sockaddr_in6 *in6;
310
622
  int tcp_port = -1;
311
622
  int udp_port = -1;
312
313
  /*
314
   * We check for both TCP and UDP in case there are
315
   * ambiguous entries.
316
   */
317
622
  memset(&hints, 0, sizeof(hints));
318
622
  hints.ai_family = PF_UNSPEC;
319
622
  hints.ai_socktype = SOCK_STREAM;
320
622
  hints.ai_protocol = IPPROTO_TCP;
321
622
  error = getaddrinfo(NULL, name, &hints, &res);
322
622
  if (error != 0) {
323
254
    if (error != EAI_NONAME &&
324
253
        error != EAI_SERVICE) {
325
      /*
326
       * This is a real error, not just "there's
327
       * no such service name".
328
       * XXX - this doesn't return an error string.
329
       */
330
0
      return 0;
331
0
    }
332
368
  } else {
333
    /*
334
     * OK, we found it.  Did it find anything?
335
     */
336
368
    for (ai = res; ai != NULL; ai = ai->ai_next) {
337
      /*
338
       * Does it have an address?
339
       */
340
368
      if (ai->ai_addr != NULL) {
341
        /*
342
         * Yes.  Get a port number; we're done.
343
         */
344
368
        if (ai->ai_addr->sa_family == AF_INET) {
345
368
          in4 = (struct sockaddr_in *)ai->ai_addr;
346
368
          tcp_port = ntohs(in4->sin_port);
347
368
          break;
348
368
        }
349
0
        if (ai->ai_addr->sa_family == AF_INET6) {
350
0
          in6 = (struct sockaddr_in6 *)ai->ai_addr;
351
0
          tcp_port = ntohs(in6->sin6_port);
352
0
          break;
353
0
        }
354
0
      }
355
368
    }
356
368
    freeaddrinfo(res);
357
368
  }
358
359
622
  memset(&hints, 0, sizeof(hints));
360
622
  hints.ai_family = PF_UNSPEC;
361
622
  hints.ai_socktype = SOCK_DGRAM;
362
622
  hints.ai_protocol = IPPROTO_UDP;
363
622
  error = getaddrinfo(NULL, name, &hints, &res);
364
622
  if (error != 0) {
365
254
    if (error != EAI_NONAME &&
366
253
        error != EAI_SERVICE) {
367
      /*
368
       * This is a real error, not just "there's
369
       * no such service name".
370
       * XXX - this doesn't return an error string.
371
       */
372
0
      return 0;
373
0
    }
374
368
  } else {
375
    /*
376
     * OK, we found it.  Did it find anything?
377
     */
378
368
    for (ai = res; ai != NULL; ai = ai->ai_next) {
379
      /*
380
       * Does it have an address?
381
       */
382
368
      if (ai->ai_addr != NULL) {
383
        /*
384
         * Yes.  Get a port number; we're done.
385
         */
386
368
        if (ai->ai_addr->sa_family == AF_INET) {
387
368
          in4 = (struct sockaddr_in *)ai->ai_addr;
388
368
          udp_port = ntohs(in4->sin_port);
389
368
          break;
390
368
        }
391
0
        if (ai->ai_addr->sa_family == AF_INET6) {
392
0
          in6 = (struct sockaddr_in6 *)ai->ai_addr;
393
0
          udp_port = ntohs(in6->sin6_port);
394
0
          break;
395
0
        }
396
0
      }
397
368
    }
398
368
    freeaddrinfo(res);
399
368
  }
400
401
  /*
402
   * We need to check /etc/services for ambiguous entries.
403
   * If we find an ambiguous entry, and it has the
404
   * same port number, change the proto to PROTO_UNDEF
405
   * so both TCP and UDP will be checked.
406
   */
407
622
  if (tcp_port >= 0) {
408
368
    *port = tcp_port;
409
368
    *proto = IPPROTO_TCP;
410
368
    if (udp_port >= 0) {
411
368
      if (udp_port == tcp_port)
412
368
        *proto = PROTO_UNDEF;
413
#ifdef notdef
414
      else
415
        /* Can't handle ambiguous names that refer
416
           to different port numbers. */
417
        warning("ambiguous port %s in /etc/services",
418
          name);
419
#endif
420
368
    }
421
368
    return 1;
422
368
  }
423
254
  if (udp_port >= 0) {
424
0
    *port = udp_port;
425
0
    *proto = IPPROTO_UDP;
426
0
    return 1;
427
0
  }
428
254
  return 0;
429
254
}
430
431
/*
432
 * Convert a string in the form PPP-PPP, where correspond to ports, to
433
 * a starting and ending port in a port range.
434
 * Return 0 on failure.
435
 */
436
int
437
pcap_nametoportrange(const char *name, int *port1, int *port2, int *proto)
438
0
{
439
0
  char *off, *cpy;
440
0
  int save_proto;
441
442
0
  if ((cpy = strdup(name)) == NULL)
443
0
    return 0;
444
445
0
  if ((off = strchr(cpy, '-')) == NULL) {
446
0
    free(cpy);
447
0
    return 0;
448
0
  }
449
450
0
  *off = '\0';
451
452
0
  if (pcap_nametoport(cpy, port1, proto) == 0) {
453
0
    free(cpy);
454
0
    return 0;
455
0
  }
456
0
  save_proto = *proto;
457
458
0
  if (pcap_nametoport(off + 1, port2, proto) == 0) {
459
0
    free(cpy);
460
0
    return 0;
461
0
  }
462
0
  free(cpy);
463
464
0
  if (*proto != save_proto)
465
0
    *proto = PROTO_UNDEF;
466
467
0
  return 1;
468
0
}
469
470
/*
471
 * XXX - not guaranteed to be thread-safe!  See below for platforms
472
 * on which it is thread-safe and on which it isn't.
473
 */
474
int
475
pcap_nametoproto(const char *str)
476
326
{
477
326
  struct protoent *p;
478
326
  #if defined(HAVE_LINUX_GETPROTOBYNAME_R)
479
  /*
480
   * We have Linux's reentrant getprotobyname_r().
481
   */
482
326
  struct protoent result_buf;
483
326
  char buf[1024]; // "...1024 bytes should be sufficient for most applications."
484
326
  int err;
485
486
326
  err = getprotobyname_r(str, &result_buf, buf, sizeof buf, &p);
487
  /*
488
   * As far as GNU libc implementation goes, an "error" means the
489
   * protocol database could not be searched, which could mean err ==
490
   * ERANGE if the buffer is too small or ENOENT if the protocols(5)
491
   * file does not exist (the man page does not document the latter
492
   * eventuality).  If the database has been searched normally and the
493
   * requested protocol name was not found, it is not an "error" and
494
   * err == 0.
495
   *
496
   * This notwithstanding, p == NULL iff a record was not found for any
497
   * reason (whether an "error" or not), which is the same semantics as
498
   * in every other HAVE_xxxxx branch of this block.  The final check
499
   * after the block will catch that if necessary.
500
   */
501
326
  if (err != 0) {
502
    /*
503
     * XXX - dynamically allocate the buffer, and make it
504
     * bigger if we get ERANGE back?
505
     */
506
326
    return PROTO_UNDEF;
507
326
  }
508
  #elif defined(HAVE_SOLARIS_GETPROTOBYNAME_R)
509
  /*
510
   * We have Solaris's reentrant getprotobyname_r().
511
   */
512
  struct protoent result_buf;
513
  char buf[1024]; // "...must be at least 1024 bytes."
514
515
  p = getprotobyname_r(str, &result_buf, buf, (int)sizeof buf);
516
  #elif defined(HAVE_AIX_GETPROTOBYNAME_R)
517
  /*
518
   * We have AIX's reentrant getprotobyname_r().
519
   */
520
  struct protoent result_buf;
521
  // "The structure must be zero-filled before it is used..." (OpenBSD).
522
  struct protoent_data proto_data = {0};
523
524
  if (getprotobyname_r(str, &result_buf, &proto_data) == -1)
525
    p = NULL;
526
  else
527
    p = &result_buf;
528
  #else
529
  /*
530
   * We don't have any getprotobyname_r(); either we have a
531
   * getprotobyname() that uses thread-specific data, in which
532
   * case we're thread-safe (sufficiently recent FreeBSD,
533
   * sufficiently recent Darwin-based OS, sufficiently recent
534
   * HP-UX, Windows), or we have
535
   * the traditional getprotobyname() (everything else, including
536
   * current NetBSD and OpenBSD), in which case we're not
537
   * thread-safe.
538
   */
539
  p = getprotobyname(str);
540
  #endif
541
0
  if (p != 0)
542
0
    return p->p_proto;
543
0
  else
544
0
    return PROTO_UNDEF;
545
0
}
546
547
#include "ethertype.h"
548
549
struct eproto {
550
  const char *s;
551
  u_short p;
552
};
553
554
/*
555
 * Static data base of ether protocol types.
556
 * tcpdump used to import this, and it's declared as an export on
557
 * Debian, at least, so make it a public symbol, even though we
558
 * don't officially export it by declaring it in a header file.
559
 * (Programs *should* do this themselves, as tcpdump now does.)
560
 *
561
 * We declare it here, right before defining it, to squelch any
562
 * warnings we might get from compilers about the lack of a
563
 * declaration.
564
 */
565
PCAP_API struct eproto eproto_db[];
566
PCAP_API_DEF struct eproto eproto_db[] = {
567
  { "aarp", ETHERTYPE_AARP },
568
  { "arp", ETHERTYPE_ARP },
569
  { "atalk", ETHERTYPE_ATALK },
570
  { "decnet", ETHERTYPE_DN },
571
  { "ip", ETHERTYPE_IP },
572
  { "ip6", ETHERTYPE_IPV6 },
573
  { "lat", ETHERTYPE_LAT },
574
  { "lldp", ETHERTYPE_LLDP },
575
  { "loopback", ETHERTYPE_LOOPBACK },
576
  { "mopdl", ETHERTYPE_MOPDL },
577
  { "moprc", ETHERTYPE_MOPRC },
578
  { "rarp", ETHERTYPE_REVARP },
579
  { "sca", ETHERTYPE_SCA },
580
  { "slow", ETHERTYPE_SLOW },
581
  { (char *)0, 0 }
582
};
583
584
int
585
pcap_nametoeproto(const char *s)
586
186
{
587
186
  struct eproto *p = eproto_db;
588
589
2.56k
  while (p->s != 0) {
590
2.41k
    if (strcmp(p->s, s) == 0)
591
34
      return p->p;
592
2.38k
    p += 1;
593
2.38k
  }
594
152
  return PROTO_UNDEF;
595
186
}
596
597
#include "llc.h"
598
599
/* Static data base of LLC values. */
600
static struct eproto llc_db[] = {
601
  { "iso", LLCSAP_ISONS },
602
  { "stp", LLCSAP_8021D },
603
  { "ipx", LLCSAP_IPX },
604
  { "netbeui", LLCSAP_NETBEUI },
605
  { (char *)0, 0 }
606
};
607
608
int
609
pcap_nametollc(const char *s)
610
152
{
611
152
  struct eproto *p = llc_db;
612
613
573
  while (p->s != 0) {
614
490
    if (strcmp(p->s, s) == 0)
615
69
      return p->p;
616
421
    p += 1;
617
421
  }
618
83
  return PROTO_UNDEF;
619
152
}
620
621
/* Hex digit to 8-bit unsigned integer. */
622
u_char
623
pcapint_xdtoi(const u_char c)
624
20.9k
{
625
20.9k
  if (c >= '0' && c <= '9')
626
7.98k
    return (u_char)(c - '0');
627
12.9k
  else if (c >= 'a' && c <= 'f')
628
7.07k
    return (u_char)(c - 'a' + 10);
629
5.85k
  else
630
5.85k
    return (u_char)(c - 'A' + 10);
631
20.9k
}
632
633
int
634
pcapint_atoin(const char *s, bpf_u_int32 *addr)
635
537
{
636
537
  u_int n;
637
537
  int len;
638
639
537
  *addr = 0;
640
537
  len = 0;
641
1.12k
  for (;;) {
642
1.12k
    n = 0;
643
2.64k
    while (*s && *s != '.') {
644
1.51k
      if (n > 25) {
645
        /* The result will be > 255 */
646
2
        return -1;
647
2
      }
648
1.51k
      n = n * 10 + *s++ - '0';
649
1.51k
    }
650
1.12k
    if (n > 255)
651
2
      return -1;
652
1.11k
    *addr <<= 8;
653
1.11k
    *addr |= n & 0xff;
654
1.11k
    len += 8;
655
1.11k
    if (*s == '\0')
656
533
      return len;
657
586
    ++s;
658
586
  }
659
  /* NOTREACHED */
660
537
}
661
662
/*
663
 * If 's' is not a string that is a well-formed DECnet address (aa.nnnn),
664
 * return zero.  Otherwise parse the address into the low 16 bits of 'addr'
665
 * and return a non-zero.  The binary DECnet address consists of a 6-bit area
666
 * number and a 10-bit node number; neither area 0 nor node 0 are valid for
667
 * normal addressing purposes, but either can appear on the wire.
668
 */
669
int
670
pcapint_atodn(const char *s, bpf_u_int32 *addr)
671
334
{
672
634
#define AREASHIFT 10
673
334
#define AREAMASK 0176000
674
468
#define NODEMASK 01777
675
676
  /* Initialize to squelch a compiler warning only. */
677
334
  u_int node = 0, area = 0;
678
  /*
679
   *               +--+             +--+
680
   *               |  |             |  |
681
   *               v  |             v  |
682
   * --> START --> AREA --> DOT --> NODE -->
683
   *       |          |     |        |
684
   *       |          v     v        |
685
   *       +--------> INVALID <------+
686
   */
687
334
  enum {
688
334
    START,
689
334
    AREA,
690
334
    DOT,
691
334
    NODE,
692
334
    INVALID
693
334
  } fsm_state = START;
694
695
2.11k
  while (*s) {
696
1.79k
    switch (fsm_state) {
697
334
    case START:
698
334
      if (PCAP_ISDIGIT(*s)) {
699
334
        area = *s - '0';
700
334
        fsm_state = AREA;
701
334
        break;
702
334
      }
703
0
      fsm_state = INVALID;
704
0
      break;
705
645
    case AREA:
706
645
      if (*s == '.') {
707
328
        fsm_state = DOT;
708
328
        break;
709
328
      }
710
317
      if (PCAP_ISDIGIT(*s)) {
711
316
        area = area * 10 + *s - '0';
712
316
        if (area <= AREAMASK >> AREASHIFT)
713
311
          break;
714
316
      }
715
6
      fsm_state = INVALID;
716
6
      break;
717
328
    case DOT:
718
328
      if (PCAP_ISDIGIT(*s)) {
719
328
        node = *s - '0';
720
328
        fsm_state = NODE;
721
328
        break;
722
328
      }
723
0
      fsm_state = INVALID;
724
0
      break;
725
473
    case NODE:
726
473
      if (PCAP_ISDIGIT(*s)) {
727
468
        node = node * 10 + *s - '0';
728
468
        if (node <= NODEMASK)
729
463
          break;
730
468
      }
731
10
      fsm_state = INVALID;
732
10
      break;
733
11
    case INVALID:
734
11
      return 0;
735
1.79k
    } /* switch */
736
1.78k
    s++;
737
1.78k
  } /* while */
738
  /*
739
   * This condition is false if the string comes from the lexer, but
740
   * let's not depend on that.
741
   */
742
323
  if (fsm_state != NODE)
743
5
    return 0;
744
745
318
  *addr = area << AREASHIFT | node;
746
318
  return(32);
747
323
}
748
749
/*
750
 * libpcap ARCnet address format is "^\$[0-9a-fA-F]{1,2}$" in regexp syntax.
751
 * Iff the given string is a well-formed ARCnet address, parse the string,
752
 * store the 8-bit unsigned value into the provided integer and return 1.
753
 * Otherwise return 0.
754
 *
755
 *  --> START -- $ --> DOLLAR -- [0-9a-fA-F] --> HEX1 -- \0 -->-+
756
 *        |              |                        |             |
757
 *       [.]            [.]                  [0-9a-fA-F]        |
758
 *        |              |                        |             |
759
 *        v              v                        v             v
760
 *    (invalid) <--------+-<---------------[.]-- HEX2 -- \0 -->-+--> (valid)
761
 */
762
int
763
pcapint_atoan(const char *s, uint8_t *addr)
764
723
{
765
723
  enum {
766
723
    START,
767
723
    DOLLAR,
768
723
    HEX1,
769
723
    HEX2,
770
723
  } fsm_state = START;
771
723
  uint8_t tmp = 0;
772
773
2.52k
  while (*s) {
774
1.79k
    switch (fsm_state) {
775
723
    case START:
776
723
      if (*s != '$')
777
0
        goto invalid;
778
723
      fsm_state = DOLLAR;
779
723
      break;
780
723
    case DOLLAR:
781
723
      if (! PCAP_ISXDIGIT(*s))
782
0
        goto invalid;
783
723
      tmp = pcapint_xdtoi(*s);
784
723
      fsm_state = HEX1;
785
723
      break;
786
351
    case HEX1:
787
351
      if (! PCAP_ISXDIGIT(*s))
788
0
        goto invalid;
789
351
      tmp <<= 4;
790
351
      tmp |= pcapint_xdtoi(*s);
791
351
      fsm_state = HEX2;
792
351
      break;
793
0
    case HEX2:
794
0
      goto invalid;
795
1.79k
    } // switch
796
1.79k
    s++;
797
1.79k
  } // while
798
723
  if (fsm_state == HEX1 || fsm_state == HEX2) {
799
723
    *addr = tmp;
800
723
    return 1;
801
723
  }
802
803
0
invalid:
804
0
  return 0;
805
723
}
806
807
// Man page: "xxxxxxxxxxxx", regexp: "^[0-9a-fA-F]{12}$".
808
static u_char
809
pcapint_atomac48_xxxxxxxxxxxx(const char *s, uint8_t *addr)
810
2.01k
{
811
2.01k
  if (strlen(s) == 12 &&
812
1.34k
      PCAP_ISXDIGIT(s[0]) &&
813
1.34k
      PCAP_ISXDIGIT(s[1]) &&
814
1.01k
      PCAP_ISXDIGIT(s[2]) &&
815
944
      PCAP_ISXDIGIT(s[3]) &&
816
944
      PCAP_ISXDIGIT(s[4]) &&
817
944
      PCAP_ISXDIGIT(s[5]) &&
818
944
      PCAP_ISXDIGIT(s[6]) &&
819
944
      PCAP_ISXDIGIT(s[7]) &&
820
944
      PCAP_ISXDIGIT(s[8]) &&
821
944
      PCAP_ISXDIGIT(s[9]) &&
822
944
      PCAP_ISXDIGIT(s[10]) &&
823
944
      PCAP_ISXDIGIT(s[11])) {
824
944
    addr[0] = pcapint_xdtoi(s[0]) << 4 | pcapint_xdtoi(s[1]);
825
944
    addr[1] = pcapint_xdtoi(s[2]) << 4 | pcapint_xdtoi(s[3]);
826
944
    addr[2] = pcapint_xdtoi(s[4]) << 4 | pcapint_xdtoi(s[5]);
827
944
    addr[3] = pcapint_xdtoi(s[6]) << 4 | pcapint_xdtoi(s[7]);
828
944
    addr[4] = pcapint_xdtoi(s[8]) << 4 | pcapint_xdtoi(s[9]);
829
944
    addr[5] = pcapint_xdtoi(s[10]) << 4 | pcapint_xdtoi(s[11]);
830
944
    return 1;
831
944
  }
832
1.06k
  return 0;
833
2.01k
}
834
835
// Man page: "xxxx.xxxx.xxxx", regexp: "^[0-9a-fA-F]{4}(\.[0-9a-fA-F]{4}){2}$".
836
static u_char
837
pcapint_atomac48_xxxx_3_times(const char *s, uint8_t *addr)
838
1.06k
{
839
1.06k
  const char sep = '.';
840
1.06k
  if (strlen(s) == 14 &&
841
307
      PCAP_ISXDIGIT(s[0]) &&
842
307
      PCAP_ISXDIGIT(s[1]) &&
843
259
      PCAP_ISXDIGIT(s[2]) &&
844
157
      PCAP_ISXDIGIT(s[3]) &&
845
157
      s[4] == sep &&
846
157
      PCAP_ISXDIGIT(s[5]) &&
847
157
      PCAP_ISXDIGIT(s[6]) &&
848
157
      PCAP_ISXDIGIT(s[7]) &&
849
157
      PCAP_ISXDIGIT(s[8]) &&
850
157
      s[9] == sep &&
851
157
      PCAP_ISXDIGIT(s[10]) &&
852
157
      PCAP_ISXDIGIT(s[11]) &&
853
157
      PCAP_ISXDIGIT(s[12]) &&
854
157
      PCAP_ISXDIGIT(s[13])) {
855
157
    addr[0] = pcapint_xdtoi(s[0]) << 4 | pcapint_xdtoi(s[1]);
856
157
    addr[1] = pcapint_xdtoi(s[2]) << 4 | pcapint_xdtoi(s[3]);
857
157
    addr[2] = pcapint_xdtoi(s[5]) << 4 | pcapint_xdtoi(s[6]);
858
157
    addr[3] = pcapint_xdtoi(s[7]) << 4 | pcapint_xdtoi(s[8]);
859
157
    addr[4] = pcapint_xdtoi(s[10]) << 4 | pcapint_xdtoi(s[11]);
860
157
    addr[5] = pcapint_xdtoi(s[12]) << 4 | pcapint_xdtoi(s[13]);
861
157
    return 1;
862
157
  }
863
910
  return 0;
864
1.06k
}
865
866
/*
867
 * Man page: "xx:xx:xx:xx:xx:xx", regexp: "^[0-9a-fA-F]{1,2}(:[0-9a-fA-F]{1,2}){5}$".
868
 * Man page: "xx-xx-xx-xx-xx-xx", regexp: "^[0-9a-fA-F]{1,2}(-[0-9a-fA-F]{1,2}){5}$".
869
 * Man page: "xx.xx.xx.xx.xx.xx", regexp: "^[0-9a-fA-F]{1,2}(\.[0-9a-fA-F]{1,2}){5}$".
870
 * (Any "xx" above can be "x", which is equivalent to "0x".)
871
 *
872
 * An equivalent (and parametrisable for EUI-64) FSM could be implemented using
873
 * a smaller graph, but that graph would be neither acyclic nor planar nor
874
 * trivial to verify.
875
 *
876
 *                |
877
 *    [.]         v
878
 * +<---------- START
879
 * |              |
880
 * |              | [0-9a-fA-F]
881
 * |  [.]         v
882
 * +<--------- BYTE0_X ----------+
883
 * |              |              |
884
 * |              | [0-9a-fA-F]  |
885
 * |  [.]         v              |
886
 * +<--------- BYTE0_XX          | [:\.-]
887
 * |              |              |
888
 * |              | [:\.-]       |
889
 * |  [.]         v              |
890
 * +<----- BYTE0_SEP_BYTE1 <-----+
891
 * |              |
892
 * |              | [0-9a-fA-F]
893
 * |  [.]         v
894
 * +<--------- BYTE1_X ----------+
895
 * |              |              |
896
 * |              | [0-9a-fA-F]  |
897
 * |  [.]         v              |
898
 * +<--------- BYTE1_XX          | <sep>
899
 * |              |              |
900
 * |              | <sep>        |
901
 * |  [.]         v              |
902
 * +<----- BYTE1_SEP_BYTE2 <-----+
903
 * |              |
904
 * |              | [0-9a-fA-F]
905
 * |  [.]         v
906
 * +<--------- BYTE2_X ----------+
907
 * |              |              |
908
 * |              | [0-9a-fA-F]  |
909
 * |  [.]         v              |
910
 * +<--------- BYTE2_XX          | <sep>
911
 * |              |              |
912
 * |              | <sep>        |
913
 * |  [.]         v              |
914
 * +<----- BYTE2_SEP_BYTE3 <-----+
915
 * |              |
916
 * |              | [0-9a-fA-F]
917
 * |  [.]         v
918
 * +<--------- BYTE3_X ----------+
919
 * |              |              |
920
 * |              | [0-9a-fA-F]  |
921
 * |  [.]         v              |
922
 * +<--------- BYTE3_XX          | <sep>
923
 * |              |              |
924
 * |              | <sep>        |
925
 * |  [.]         v              |
926
 * +<----- BYTE3_SEP_BYTE4 <-----+
927
 * |              |
928
 * |              | [0-9a-fA-F]
929
 * |  [.]         v
930
 * +<--------- BYTE4_X ----------+
931
 * |              |              |
932
 * |              | [0-9a-fA-F]  |
933
 * |  [.]         v              |
934
 * +<--------- BYTE4_XX          | <sep>
935
 * |              |              |
936
 * |              | <sep>        |
937
 * |  [.]         v              |
938
 * +<----- BYTE4_SEP_BYTE5 <-----+
939
 * |              |
940
 * |              | [0-9a-fA-F]
941
 * |  [.]         v
942
 * +<--------- BYTE5_X ----------+
943
 * |              |              |
944
 * |              | [0-9a-fA-F]  |
945
 * |  [.]         v              |
946
 * +<--------- BYTE5_XX          | \0
947
 * |              |              |
948
 * |              | \0           |
949
 * |              |              v
950
 * +--> (reject)  +---------> (accept)
951
 *
952
 */
953
static u_char
954
pcapint_atomac48_x_xx_6_times(const char *s, uint8_t *addr)
955
910
{
956
910
  enum {
957
910
    START,
958
910
    BYTE0_X,
959
910
    BYTE0_XX,
960
910
    BYTE0_SEP_BYTE1,
961
910
    BYTE1_X,
962
910
    BYTE1_XX,
963
910
    BYTE1_SEP_BYTE2,
964
910
    BYTE2_X,
965
910
    BYTE2_XX,
966
910
    BYTE2_SEP_BYTE3,
967
910
    BYTE3_X,
968
910
    BYTE3_XX,
969
910
    BYTE3_SEP_BYTE4,
970
910
    BYTE4_X,
971
910
    BYTE4_XX,
972
910
    BYTE4_SEP_BYTE5,
973
910
    BYTE5_X,
974
910
    BYTE5_XX,
975
910
  } fsm_state = START;
976
910
  uint8_t buf[6];
977
910
  const char *seplist = ":.-";
978
  /*
979
   * XXX - the state diagram indicates that we cannot get to states
980
   * BYTEn_X or BYTEn_XX, for n > 0, without first going through
981
   * states BYTE0_X or BYTE0_XX, but at least some versions of
982
   * MSVC complain that sep may be used uninitialized, so we
983
   * initialize it here.
984
   */
985
910
  char sep = '\0';
986
987
12.0k
  while (*s) {
988
11.1k
    switch (fsm_state) {
989
910
    case START:
990
910
      if (PCAP_ISXDIGIT(*s)) {
991
910
        buf[0] = pcapint_xdtoi(*s);
992
910
        fsm_state = BYTE0_X;
993
910
        break;
994
910
      }
995
0
      goto reject;
996
910
    case BYTE0_X:
997
910
      if (strchr(seplist, *s)) {
998
670
        sep = *s;
999
670
        fsm_state = BYTE0_SEP_BYTE1;
1000
670
        break;
1001
670
      }
1002
240
      if (PCAP_ISXDIGIT(*s)) {
1003
240
        buf[0] = buf[0] << 4 | pcapint_xdtoi(*s);
1004
240
        fsm_state = BYTE0_XX;
1005
240
        break;
1006
240
      }
1007
0
      goto reject;
1008
240
    case BYTE0_XX:
1009
240
      if (strchr(seplist, *s)) {
1010
240
        sep = *s;
1011
240
        fsm_state = BYTE0_SEP_BYTE1;
1012
240
        break;
1013
240
      }
1014
0
      goto reject;
1015
910
    case BYTE0_SEP_BYTE1:
1016
910
      if (PCAP_ISXDIGIT(*s)) {
1017
910
        buf[1] = pcapint_xdtoi(*s);
1018
910
        fsm_state = BYTE1_X;
1019
910
        break;
1020
910
      }
1021
0
      goto reject;
1022
910
    case BYTE1_X:
1023
910
      if (*s == sep) {
1024
699
        fsm_state = BYTE1_SEP_BYTE2;
1025
699
        break;
1026
699
      }
1027
211
      if (PCAP_ISXDIGIT(*s)) {
1028
211
        buf[1] = buf[1] << 4 | pcapint_xdtoi(*s);
1029
211
        fsm_state = BYTE1_XX;
1030
211
        break;
1031
211
      }
1032
0
      goto reject;
1033
211
    case BYTE1_XX:
1034
211
      if (*s == sep) {
1035
211
        fsm_state = BYTE1_SEP_BYTE2;
1036
211
        break;
1037
211
      }
1038
0
      goto reject;
1039
910
    case BYTE1_SEP_BYTE2:
1040
910
      if (PCAP_ISXDIGIT(*s)) {
1041
910
        buf[2] = pcapint_xdtoi(*s);
1042
910
        fsm_state = BYTE2_X;
1043
910
        break;
1044
910
      }
1045
0
      goto reject;
1046
910
    case BYTE2_X:
1047
910
      if (*s == sep) {
1048
732
        fsm_state = BYTE2_SEP_BYTE3;
1049
732
        break;
1050
732
      }
1051
178
      if (PCAP_ISXDIGIT(*s)) {
1052
178
        buf[2] = buf[2] << 4 | pcapint_xdtoi(*s);
1053
178
        fsm_state = BYTE2_XX;
1054
178
        break;
1055
178
      }
1056
0
      goto reject;
1057
178
    case BYTE2_XX:
1058
178
      if (*s == sep) {
1059
178
        fsm_state = BYTE2_SEP_BYTE3;
1060
178
        break;
1061
178
      }
1062
0
      goto reject;
1063
910
    case BYTE2_SEP_BYTE3:
1064
910
      if (PCAP_ISXDIGIT(*s)) {
1065
910
        buf[3] = pcapint_xdtoi(*s);
1066
910
        fsm_state = BYTE3_X;
1067
910
        break;
1068
910
      }
1069
0
      goto reject;
1070
910
    case BYTE3_X:
1071
910
      if (*s == sep) {
1072
719
        fsm_state = BYTE3_SEP_BYTE4;
1073
719
        break;
1074
719
      }
1075
191
      if (PCAP_ISXDIGIT(*s)) {
1076
191
        buf[3] = buf[3] << 4 | pcapint_xdtoi(*s);
1077
191
        fsm_state = BYTE3_XX;
1078
191
        break;
1079
191
      }
1080
0
      goto reject;
1081
191
    case BYTE3_XX:
1082
191
      if (*s == sep) {
1083
191
        fsm_state = BYTE3_SEP_BYTE4;
1084
191
        break;
1085
191
      }
1086
0
      goto reject;
1087
910
    case BYTE3_SEP_BYTE4:
1088
910
      if (PCAP_ISXDIGIT(*s)) {
1089
910
        buf[4] = pcapint_xdtoi(*s);
1090
910
        fsm_state = BYTE4_X;
1091
910
        break;
1092
910
      }
1093
0
      goto reject;
1094
910
    case BYTE4_X:
1095
910
      if (*s == sep) {
1096
745
        fsm_state = BYTE4_SEP_BYTE5;
1097
745
        break;
1098
745
      }
1099
165
      if (PCAP_ISXDIGIT(*s)) {
1100
165
        buf[4] = buf[4] << 4 | pcapint_xdtoi(*s);
1101
165
        fsm_state = BYTE4_XX;
1102
165
        break;
1103
165
      }
1104
0
      goto reject;
1105
165
    case BYTE4_XX:
1106
165
      if (*s == sep) {
1107
165
        fsm_state = BYTE4_SEP_BYTE5;
1108
165
        break;
1109
165
      }
1110
0
      goto reject;
1111
910
    case BYTE4_SEP_BYTE5:
1112
910
      if (PCAP_ISXDIGIT(*s)) {
1113
910
        buf[5] = pcapint_xdtoi(*s);
1114
910
        fsm_state = BYTE5_X;
1115
910
        break;
1116
910
      }
1117
0
      goto reject;
1118
183
    case BYTE5_X:
1119
183
      if (PCAP_ISXDIGIT(*s)) {
1120
183
        buf[5] = buf[5] << 4 | pcapint_xdtoi(*s);
1121
183
        fsm_state = BYTE5_XX;
1122
183
        break;
1123
183
      }
1124
0
      goto reject;
1125
0
    case BYTE5_XX:
1126
0
      goto reject;
1127
11.1k
    } // switch
1128
11.1k
    s++;
1129
11.1k
  } // while
1130
1131
910
  if (fsm_state == BYTE5_X || fsm_state == BYTE5_XX) {
1132
    // accept
1133
910
    memcpy(addr, buf, sizeof(buf));
1134
910
    return 1;
1135
910
  }
1136
1137
0
reject:
1138
0
  return 0;
1139
910
}
1140
1141
// The 'addr' argument must point to an array of at least 6 elements.
1142
int
1143
pcapint_atomac48(const char *s, uint8_t *addr)
1144
2.01k
{
1145
2.01k
  return s && (
1146
2.01k
      pcapint_atomac48_xxxxxxxxxxxx(s, addr) ||
1147
1.06k
      pcapint_atomac48_xxxx_3_times(s, addr) ||
1148
910
      pcapint_atomac48_x_xx_6_times(s, addr)
1149
2.01k
  );
1150
2.01k
}
1151
1152
/*
1153
 * If 's' is a MAC-48 address in one of the forms documented in pcap-filter(7)
1154
 * for "ether host", return a pointer to an allocated buffer with the binary
1155
 * value of the address.  Return NULL on any error.
1156
 */
1157
u_char *
1158
pcap_ether_aton(const char *s)
1159
0
{
1160
0
  uint8_t tmp[6];
1161
0
  if (! pcapint_atomac48(s, tmp))
1162
0
    return (NULL);
1163
1164
0
  u_char *e = malloc(6);
1165
0
  if (e == NULL)
1166
0
    return (NULL);
1167
0
  memcpy(e, tmp, sizeof(tmp));
1168
0
  return (e);
1169
0
}
1170
1171
#ifndef HAVE_ETHER_HOSTTON
1172
/*
1173
 * Roll our own.
1174
 *
1175
 * This should be thread-safe, as we define the static variables
1176
 * we use to be thread-local, and as pcap_next_etherent() does so
1177
 * as well.
1178
 */
1179
u_char *
1180
pcap_ether_hostton(const char *name)
1181
{
1182
  struct pcap_etherent *ep;
1183
  u_char *ap;
1184
  static thread_local FILE *fp = NULL;
1185
  static thread_local int init = 0;
1186
1187
  if (!init) {
1188
    fp = fopen(PCAP_ETHERS_FILE, "r");
1189
    ++init;
1190
    if (fp == NULL)
1191
      return (NULL);
1192
  } else if (fp == NULL)
1193
    return (NULL);
1194
  else
1195
    rewind(fp);
1196
1197
  while ((ep = pcap_next_etherent(fp)) != NULL) {
1198
    if (strcmp(ep->name, name) == 0) {
1199
      ap = (u_char *)malloc(6);
1200
      if (ap != NULL) {
1201
        memcpy(ap, ep->addr, 6);
1202
        return (ap);
1203
      }
1204
      break;
1205
    }
1206
  }
1207
  return (NULL);
1208
}
1209
#else
1210
/*
1211
 * Use the OS-supplied routine.
1212
 * This *should* be thread-safe; the API doesn't have a static buffer.
1213
 */
1214
u_char *
1215
pcap_ether_hostton(const char *name)
1216
87
{
1217
87
  u_char *ap;
1218
87
  u_char a[6];
1219
87
  char namebuf[1024];
1220
1221
  /*
1222
   * In AIX 7.1 and 7.2: int ether_hostton(char *, struct ether_addr *);
1223
   */
1224
87
  pcapint_strlcpy(namebuf, name, sizeof(namebuf));
1225
87
  ap = NULL;
1226
87
  if (ether_hostton(namebuf, (struct ether_addr *)a) == 0) {
1227
0
    ap = (u_char *)malloc(6);
1228
0
    if (ap != NULL)
1229
0
      memcpy((char *)ap, (char *)a, 6);
1230
0
  }
1231
87
  return (ap);
1232
87
}
1233
#endif