Convert core parse_type implementations to check for underflow errors.
authorzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 17 Jun 2009 00:30:29 +0000 (00:30 +0000)
committerzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 17 Jun 2009 00:30:29 +0000 (00:30 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@2256 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/helper/command.c

index 30c5b121049ec398955707f49c50dcc79234f78d..9a8907d6ac13374264339f868c19820264bb2105 100644 (file)
@@ -863,16 +863,20 @@ long jim_global_long(const char *variable)
        return 0;
 }
 
-#define DEFINE_PARSE_NUM_TYPE(name, type, func, max) \
+#define DEFINE_PARSE_NUM_TYPE(name, type, func, min, max) \
        int parse##name(const char *str, type *ul) \
        { \
+               if (!*str) \
+                       return ERROR_COMMAND_SYNTAX_ERROR; \
                char *end; \
                *ul = func(str, &end, 0); \
-               bool is_okay = *str && !*end && (max != *ul); \
-               return is_okay ? ERROR_OK : ERROR_COMMAND_SYNTAX_ERROR; \
+               if (*end) \
+                       return ERROR_COMMAND_SYNTAX_ERROR; \
+               if (*ul == max || (min && min == *ul)) \
+                       return ERROR_COMMAND_SYNTAX_ERROR; \
+               return ERROR_OK; \
        }
-DEFINE_PARSE_NUM_TYPE(_ulong, unsigned long , strtoul, ULONG_MAX)
-DEFINE_PARSE_NUM_TYPE(_ullong, unsigned long long, strtoull, ULLONG_MAX)
-DEFINE_PARSE_NUM_TYPE(_long, long , strtol, LONG_MAX)
-DEFINE_PARSE_NUM_TYPE(_llong, long long, strtoll, LLONG_MAX)
-
+DEFINE_PARSE_NUM_TYPE(_ulong, unsigned long , strtoul, 0, ULONG_MAX)
+DEFINE_PARSE_NUM_TYPE(_ullong, unsigned long long, strtoull, 0, ULLONG_MAX)
+DEFINE_PARSE_NUM_TYPE(_long, long , strtol, LONG_MIN, LONG_MAX)
+DEFINE_PARSE_NUM_TYPE(_llong, long long, strtoll, LLONG_MIN, LLONG_MAX)