]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: fix some strtoul() use cases
authorUlrich Weber <ulrich.weber@sophos.com>
Tue, 20 Dec 2011 22:24:11 +0000 (02:24 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 2 Jan 2012 15:50:57 +0000 (19:50 +0400)
...otherwise 4294967295 is not a valid value on 32bit systems

bgpd/bgp_mplsvpn.c
bgpd/bgp_routemap.c
lib/vty.h
ospfd/ospf_vty.c

index 72ad089e42a2e814c4f4fd5a2bd4da9621b41ee8..c1f1fbb37d0cd0402911e0320c95f6bac6a48fc7 100644 (file)
@@ -233,9 +233,13 @@ str2tag (const char *str, u_char *tag)
   char *endptr;
   u_int32_t t;
 
-  l = strtoul (str, &endptr, 10);
+  if (*str == '-')
+    return 0;
   
-  if (*endptr == '\0' || l == ULONG_MAX || l > UINT32_MAX)
+  errno = 0;
+  l = strtoul (str, &endptr, 10);
+
+  if (*endptr != '\0' || errno || l > UINT32_MAX)
     return 0;
 
   t = (u_int32_t) l;
index 173bf93b14877c0e9f52c141f18e2f8893b07640..42c3e053e59fee3402791d9d65831b21bdb0f49d 100644 (file)
@@ -525,8 +525,13 @@ route_match_metric_compile (const char *arg)
   char *endptr = NULL;
   unsigned long tmpval;
 
+  /* Metric value shoud be integer. */
+  if (! all_digit (arg))
+    return NULL;
+
+  errno = 0;
   tmpval = strtoul (arg, &endptr, 10);
-  if (*endptr != '\0' || tmpval == ULONG_MAX || tmpval > UINT32_MAX)
+  if (*endptr != '\0' || errno || tmpval > UINT32_MAX)
     return NULL;
     
   med = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
@@ -1002,8 +1007,9 @@ route_set_local_pref_compile (const char *arg)
   if (! all_digit (arg))
     return NULL;
   
+  errno = 0;
   tmp = strtoul (arg, &endptr, 10);
-  if (*endptr != '\0' || tmp == ULONG_MAX || tmp > UINT32_MAX)
+  if (*endptr != '\0' || errno || tmp > UINT32_MAX)
     return NULL;
    
   local_pref = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t)); 
@@ -1070,9 +1076,9 @@ route_set_weight_compile (const char *arg)
   if (! all_digit (arg))
     return NULL;
 
-
+  errno = 0;
   tmp = strtoul (arg, &endptr, 10);
-  if (*endptr != '\0' || tmp == ULONG_MAX || tmp > UINT32_MAX)
+  if (*endptr != '\0' || errno || tmp > UINT32_MAX)
     return NULL;
   
   weight = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
@@ -1161,8 +1167,9 @@ route_set_metric_compile (const char *arg)
   if (all_digit (arg))
     {
       /* set metric value check*/
+      errno = 0;
       larg = strtoul (arg, &endptr, 10);
-      if (*endptr != '\0' || larg == ULONG_MAX || larg > UINT32_MAX)
+      if (*endptr != '\0' || errno || larg > UINT32_MAX)
         return NULL;
       metric = larg;
     }
@@ -1174,8 +1181,9 @@ route_set_metric_compile (const char *arg)
           || (! all_digit (arg+1)))
        return NULL;
 
+      errno = 0;
       larg = strtoul (arg+1, &endptr, 10);
-      if (*endptr != '\0' || larg == ULONG_MAX || larg > UINT32_MAX)
+      if (*endptr != '\0' || errno || larg > UINT32_MAX)
        return NULL;
       metric = larg;
     }
index 7df04b5fbad53dc6ca378456550135dc4c73678f..639d74175eb02e67b305ed37df7bee7062c9d726 100644 (file)
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -152,8 +152,9 @@ struct vty
 #define VTY_GET_LONG(NAME,V,STR) \
 do { \
   char *endptr = NULL; \
+  errno = 0; \
   (V) = strtoul ((STR), &endptr, 10); \
-  if (*endptr != '\0' || (V) == ULONG_MAX) \
+  if (*(STR) == '-' || *endptr != '\0' || errno) \
     { \
       vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
       return CMD_WARNING; \
index 577e41788626a528615f07b70f8b1d9a4b1572a2..f68adb2d1dc49b6cc03fafe8af4f4f5fa348621d 100644 (file)
@@ -80,8 +80,11 @@ ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
   /* match "<0-4294967295>". */
   else
     {
+      if (*str == '-')
+        return -1;
+      errno = 0;
       ret = strtoul (str, &endptr, 10);
-      if (*endptr != '\0' || (ret == ULONG_MAX && errno == ERANGE))
+      if (*endptr != '\0' || errno || ret > UINT32_MAX)
         return -1;
 
       area_id->s_addr = htonl (ret);