#include "parse_utils.h"
#include <cassert>
+#include <climits>
#include <cstring>
#include "log/messages.h"
int parse_int(const char* data, const char* tag, int low, int high)
{
- int32_t value = 0;
+ assert(low <= high);
+
+ long value = 0;
char* endptr = nullptr;
value = SnortStrtol(data, &endptr, 10);
if (*endptr)
{
ParseError("invalid '%s' format.", tag);
- return value;
+ return (int)value;
}
- if (errno == ERANGE)
+ if (errno == ERANGE || value > INT_MAX || value < INT_MIN)
{
ParseError("range problem on '%s' value.", tag);
- return value;
+ errno = ERANGE;
}
-
- if ((value > high) || (value < low))
+ else if ((value > high) || (value < low))
{
ParseError("'%s' must be in %d:%d, inclusive", tag, low, high);
- return value;
}
- return value;
+ if (value > high)
+ return high;
+ else if (value < low)
+ return low;
+ return (int)value;
}
//--------------------------------------------------------------------------
int res = parse_int(data, "test");
- CHECK(res == -1);
+ CHECK(res == 65535);
CHECK(errno == ERANGE);
}
int res = parse_int(data, "test");
- CHECK(res == 0);
+ CHECK(res == -65535);
CHECK(errno == ERANGE);
}
{
int res = parse_int("1", "test", 2, 3);
- CHECK(res == 1);
+ CHECK(res == 2);
}
SECTION("above the limit")
{
int res = parse_int("4", "test", 2, 3);
- CHECK(res == 4);
+ CHECK(res == 3);
}
}