X-Git-Url: https://git.tcpdump.org/libpcap/blobdiff_plain/30e89f192a05c27009eb0df86d1ba44d6850b8e6..09b51d326c38ea8e10ce4da09c09d50e08c5aeb8:/etherent.c diff --git a/etherent.c b/etherent.c index 28b70287..69da9a54 100644 --- a/etherent.c +++ b/etherent.c @@ -19,63 +19,57 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/etherent.c,v 1.22 2003-11-15 23:23:57 guy Exp $ (LBL)"; -#endif - #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include +#include -#include #include #include #include #include "pcap-int.h" -#include +#include #ifdef HAVE_OS_PROTO_H #include "os-proto.h" #endif -static inline int xdtoi(int); static inline int skip_space(FILE *); static inline int skip_line(FILE *); /* Hex digit to integer. */ -static inline int -xdtoi(c) - register int c; +static inline u_char +xdtoi(u_char c) { - if (isdigit(c)) - return c - '0'; - else if (islower(c)) - return c - 'a' + 10; + if (c >= '0' && c <= '9') + return (u_char)(c - '0'); + else if (c >= 'a' && c <= 'f') + return (u_char)(c - 'a' + 10); else - return c - 'A' + 10; + return (u_char)(c - 'A' + 10); } +/* + * Skip linear white space (space and tab) and any CRs before LF. + * Stop when we hit a non-white-space character or an end-of-line LF. + */ static inline int -skip_space(f) - FILE *f; +skip_space(FILE *f) { int c; do { c = getc(f); - } while (isspace(c) && c != '\n'); + } while (c == ' ' || c == '\t' || c == '\r'); return c; } static inline int -skip_line(f) - FILE *f; +skip_line(FILE *f) { int c; @@ -89,47 +83,61 @@ skip_line(f) struct pcap_etherent * pcap_next_etherent(FILE *fp) { - register int c, d, i; + register int c, i; + u_char d; char *bp; + size_t namesize; static struct pcap_etherent e; memset((char *)&e, 0, sizeof(e)); - do { + for (;;) { /* Find addr */ c = skip_space(fp); + if (c == EOF) + return (NULL); if (c == '\n') continue; /* If this is a comment, or first thing on line - cannot be etehrnet address, skip the line. */ - if (!isxdigit(c)) { + cannot be Ethernet address, skip the line. */ + if (!PCAP_ISXDIGIT(c)) { c = skip_line(fp); + if (c == EOF) + return (NULL); continue; } /* must be the start of an address */ for (i = 0; i < 6; i += 1) { - d = xdtoi(c); + d = xdtoi((u_char)c); c = getc(fp); - if (isxdigit(c)) { + if (c == EOF) + return (NULL); + if (PCAP_ISXDIGIT(c)) { d <<= 4; - d |= xdtoi(c); + d |= xdtoi((u_char)c); c = getc(fp); + if (c == EOF) + return (NULL); } e.addr[i] = d; if (c != ':') break; c = getc(fp); + if (c == EOF) + return (NULL); } - if (c == EOF) - break; /* Must be whitespace */ - if (!isspace(c)) { + if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { c = skip_line(fp); + if (c == EOF) + return (NULL); continue; } c = skip_space(fp); + if (c == EOF) + return (NULL); /* hit end of line... */ if (c == '\n') @@ -137,17 +145,22 @@ pcap_next_etherent(FILE *fp) if (c == '#') { c = skip_line(fp); + if (c == EOF) + return (NULL); continue; } /* pick up name */ bp = e.name; - /* Use 'd' to prevent buffer overflow. */ - d = sizeof(e.name) - 1; + /* Use 'namesize' to prevent buffer overflow. */ + namesize = sizeof(e.name) - 1; do { - *bp++ = c; + *bp++ = (u_char)c; c = getc(fp); - } while (!isspace(c) && c != EOF && --d > 0); + if (c == EOF) + return (NULL); + } while (c != ' ' && c != '\t' && c != '\r' && c != '\n' + && --namesize != 0); *bp = '\0'; /* Eat trailing junk */ @@ -155,8 +168,5 @@ pcap_next_etherent(FILE *fp) (void)skip_line(fp); return &e; - - } while (c != EOF); - - return (NULL); + } }