diff --git a/lib/libpcap/scanner.l b/lib/libpcap/scanner.l index 86a1936b908..0dcd6cc9056 100644 --- a/lib/libpcap/scanner.l +++ b/lib/libpcap/scanner.l @@ -1,5 +1,5 @@ %{ -/* $OpenBSD: scanner.l,v 1.32 2024/08/29 07:33:50 anton Exp $ */ +/* $OpenBSD: scanner.l,v 1.33 2024/09/24 14:20:31 sthen Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -48,6 +47,7 @@ #include "grammar.h" static int stoi(char *); +static inline int xdtoi(int); #ifdef FLEX_SCANNER #define YY_NO_UNPUT @@ -333,23 +333,41 @@ yywrap(void) return 1; } +/* Hex digit to integer. */ +static inline int +xdtoi(int c) +{ + if (isdigit(c)) + return c - '0'; + else if (islower(c)) + return c - 'a' + 10; + else + return c - 'A' + 10; +} + /* - * Convert string to integer supporting also octal and hex notations. + * Convert string to integer. Just like atoi(), but checks for + * preceding 0x or 0 and uses hex or octal instead of decimal. */ static int stoi(char *s) { - long lval; - char *ep; + int base = 10; + int n = 0; - errno = 0; - lval = strtol(s, &ep, 0); - if (*s == '\0' || *ep != '\0') - bpf_error("invalid number %s", s); - if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) || - (lval > INT_MAX || lval < INT_MIN)) - bpf_error("out of range: %s", s); + if (*s == '0') { + if (s[1] == 'x' || s[1] == 'X') { + s += 2; + base = 16; + } + else { + base = 8; + s += 1; + } + } + while (*s) + n = n * base + xdtoi(*s++); - return lval; + return n; }