diff --git a/src/util.c b/src/util.c --- a/src/util.c +++ b/src/util.c @@ -1743,8 +1743,65 @@ void * SnortAlloc2(size_t size, const char *format, ...) return tmp; } /** + * SnortStrToNumRng - Parses a number (signed) range split by a delimiter. + * @str: char pointer to the string to be parsed. + * @delimiter: char pointer to the delimiter separating the two ranges. + * @rng: int pointer to the smaller value of the range. + * + * Returns: + * SNORT_STR2RNG_SUCCESS is a range was successfully parsed. + * SNORT_STR2RNG_NOTRNG if the range delimiter was not found. + * SNORT_STR2RNG_ERROR if an error condition was encountered. + */ +int SnortStrToNumRng(char *str, const char *delimiter, NumericRange *rng) +{ + if (!str || !delimiter || !rng) + return SNORT_STR2RNG_ERROR; + + if (SnortStrcasestr(str, strlen(str), delimiter)) + { + char *tok, *end; + int num = 0; + + /* Get the first token. */ + tok = strtok(str, delimiter); + if (!tok) + return SNORT_STR2RNG_ERROR; + + num = strtol(tok, &end, 10); + if (*end) + return SNORT_STR2RNG_ERROR; + + rng->min = num; + + /* Get the second token. */ + tok = strtok(NULL, delimiter); + if (!tok) + return SNORT_STR2RNG_ERROR; + + num = strtol(tok, &end, 10); + if (*end) + return SNORT_STR2RNG_ERROR; + + rng->max = num; + + /* See if min is > max. If so, swap them. */ + if (rng->min > rng->max) + { + int tmp = rng->min; + rng->min = rng->max; + rng->max = tmp; + } + + return SNORT_STR2RNG_SUCCESS; + } else { + return SNORT_STR2RNG_NOTRNG; + } +} + +/** * Chroot and adjust the snort_conf->log_dir reference * * @param directory directory to chroot to * @param logstore ptr to snort_conf->log_dir which must be dynamically allocated diff --git a/src/util.h b/src/util.h --- a/src/util.h +++ b/src/util.h @@ -73,8 +73,12 @@ #define SNORT_STRNCPY_ERROR -1 #define SNORT_STRNLEN_ERROR -1 +#define SNORT_STR2RNG_SUCCESS 0 +#define SNORT_STR2RNG_ERROR -1 +#define SNORT_STR2RNG_NOTRNG -2 + #define SECONDS_PER_DAY 86400 /* number of seconds in a day */ #define SECONDS_PER_HOUR 3600 /* number of seconds in a hour */ #define SECONDS_PER_MIN 60 /* number of seconds in a minute */ @@ -171,8 +175,15 @@ typedef struct _IntervalStats #endif } IntervalStats; +/* Used by rule keywords that involve number ranges. */ +typedef struct _NumericRange +{ + int min; + int max; +} NumericRange; + /* Public function prototypes *************************************************/ int DisplayBanner(void); void GetTime(char *); @@ -215,8 +226,9 @@ const char *SnortStrnPbrk(const char *s, int slen, const char *accept); const char *SnortStrnStr(const char *s, int slen, const char *searchstr); const char *SnortStrcasestr(const char *s, int slen, const char *substr); void *SnortAlloc(unsigned long); void *SnortAlloc2(size_t, const char *, ...); +int SnortStrToNumRng(char *, const char *, NumericRange *); char *CurrentWorkingDir(void); char *GetAbsolutePath(char *dir); char *StripPrefixDir(char *prefix, char *dir); void PrintPacketData(const uint8_t *, const uint32_t);