]> granicus.if.org Git - graphviz/commitdiff
rewrite versionStr2Version to use strtoul
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Wed, 14 Apr 2021 03:04:36 +0000 (20:04 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 20 Apr 2021 14:49:55 +0000 (07:49 -0700)
The atoi function has no ability to report failure. There is no advantage to
using it over the safer strto* functions. This change also removes a
-Wconversion warning.

plugin/core/gvrender_core_dot.c

index 11fc0198698cb17240674f1b4d006fb8185f8e53..da8065f92b3de43af9b12f1211f5703ba4953489 100644 (file)
@@ -14,6 +14,7 @@
 #include <io.h>
 #endif
 
+#include <limits.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
@@ -359,26 +360,14 @@ static void xdot_end_cluster(GVJ_t * job)
 }
 
 static unsigned short
-versionStr2Version (char* str)
+versionStr2Version (const char* str)
 {
-    char c, buf[BUFSIZ];
-    int n = 0;
-    char* s = str;
-    unsigned short us;
-
-    while ((c = *s++)) {
-       if (isdigit(c)) {
-           if (n < BUFSIZ-1) buf[n++] = c;
-           else {
-               agerr(AGWARN, "xdot version \"%s\" too long", str);
-               break;
-           }
-       }
-    }
-    buf[n] = '\0';
-    
-    us = atoi(buf);
-    return us;
+  unsigned long u = strtoul(str, NULL, 10);
+  if (u == 0 || u > USHRT_MAX) {
+    agerr(AGWARN, "xdot version \"%s\" too long", str);
+  }
+
+  return (unsigned short)u;
 }
 
 /*