bool valid_ipaddr(const T* leftguard, const T* hit) { // copy up to 'window' preceding Ts into context array static const ssize_t window = 8; T context[window] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }; const ssize_t diff = min(hit - leftguard, window); copy(hit - diff, hit, context + window - diff); if ( isalnum(context[7]) || context[7] == '.' || context[7] == '-' || context[7] == '+' || (ishexnumber(context[4]) && ishexnumber(context[5]) && ishexnumber(context[6]) && context[7] == '}') || (*hit == '0' && *(hit + 1) == '.')) { // ignore return false; } static const struct { size_t pos; const char* str; } checks[] = { { 5, "v." }, { 5, "v " }, { 5, "rv:" }, // rv:1.9.2.8 as in Mozilla { 4, ">=" }, // >= 1.8.0.10 { 4, "<=" }, // <= 1.8.0.10 { 4, "<<" }, // << 1.8.0.10 { 4, "ver" }, { 4, "Ver" }, { 4, "VER" }, { 0, "rsion" }, { 0, "ion=" }, { 0, "PSW/" }, // PWS/1.5.19.3 ... { 0, "flash=" }, // flash= { 0, "stone=" }, // Milestone= { 4, "NSS" }, { 0, "/2001," }, // /2001,3.60.50.8 { 0, "TI_SZ" } // %REG_MULTI_SZ%, }; for (size_t i = 0; i < sizeof(checks)/sizeof(checks[0]); ++i) { if (search( context + checks[i].pos, context + 8, checks[i].str, checks[i].str + strlen(checks[i].str) ) != context + 8) { return false; } } return true; }
/* Return true if the string only has hex digits */ static int only_hex_digits(const char *buf,int len) { while(*buf && len){ if(ishexnumber(*buf)==0) return 0; buf++; len--; } return 1; }
/* * Tries to guess table key type. * This procedure is used in legacy table auto-create * code AND in `ipfw -n` ruleset checking. * * Imported from old table_fill_xentry() parse code. */ static int guess_key_type(char *key, uint8_t *ptype) { char *p; struct in6_addr addr; uint32_t kv; if (ishexnumber(*key) != 0 || *key == ':') { /* Remove / if exists */ if ((p = strchr(key, '/')) != NULL) *p = '\0'; if ((inet_pton(AF_INET, key, &addr) == 1) || (inet_pton(AF_INET6, key, &addr) == 1)) { *ptype = IPFW_TABLE_CIDR; if (p != NULL) *p = '/'; return (0); } else { /* Port or any other key */ /* Skip non-base 10 entries like 'fa1' */ kv = strtol(key, &p, 10); if (*p == '\0') { *ptype = IPFW_TABLE_NUMBER; return (0); } else if ((p != key) && (*p == '.')) { /* * Warn on IPv4 address strings * which are "valid" for inet_aton() but not * in inet_pton(). * * Typical examples: '10.5' or '10.0.0.05' */ return (1); } } } if (strchr(key, '.') == NULL) { *ptype = IPFW_TABLE_INTERFACE; return (0); } if (lookup_host(key, (struct in_addr *)&addr) != 0) return (1); *ptype = IPFW_TABLE_CIDR; return (0); }