Fix of ancient WinBoard bug: check value of int options
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 3 Feb 2010 12:42:09 +0000 (13:42 +0100)
committerArun Persaud <arun@nubati.net>
Sat, 6 Feb 2010 05:21:12 +0000 (21:21 -0800)
Only strings of digits are accepted now.

winboard/winboard.c

index 1e65185..a7705c4 100644 (file)
@@ -1462,6 +1462,15 @@ ExitArgError(char *msg, char *badArg)
   exit(2);\r
 }\r
 \r
+int\r
+ValidateInt(char *s)\r
+{\r
+  char *p = s;\r
+  if(*p == '-' || *p == '+') p++;\r
+  while(*p) if(!isdigit(*p++)) ExitArgError("Bad integer value", s);\r
+  return atoi(s);\r
+}\r
+\r
 /* Command line font name parser.  NULL name means do nothing.\r
    Syntax like "Courier New:10.0 bi" or "Arial:10" or "Arial:10b"\r
    For backward compatibility, syntax without the colon is also\r
@@ -1773,19 +1782,19 @@ ParseArgs(GetFunc get, void *cl)
 \r
     switch (ad->argType) {\r
     case ArgInt:\r
-      *(int *) ad->argLoc = atoi(argValue);\r
+      *(int *) ad->argLoc = ValidateInt(argValue);\r
       break;\r
 \r
     case ArgX:\r
-      *(int *) ad->argLoc = atoi(argValue) + boardX; // [HGM] placement: translate stored relative to absolute \r
+      *(int *) ad->argLoc = ValidateInt(argValue) + boardX; // [HGM] placement: translate stored relative to absolute \r
       break;\r
 \r
     case ArgY:\r
-      *(int *) ad->argLoc = atoi(argValue) + boardY; // (this is really kludgey, it should be done where used...)\r
+      *(int *) ad->argLoc = ValidateInt(argValue) + boardY; // (this is really kludgey, it should be done where used...)\r
       break;\r
 \r
     case ArgZ:\r
-      *(int *) ad->argLoc = atoi(argValue);\r
+      *(int *) ad->argLoc = ValidateInt(argValue);\r
       EnsureOnScreen(&boardX, &boardY, minX, minY); \r
       break;\r
 \r