Fix of ancient WinBoard bug: check value of int options
[xboard.git] / winboard / winboard.c
index 5a8df2b..a7705c4 100644 (file)
@@ -435,7 +435,7 @@ BOOLEAN evalGraphDialogUp = FALSE;
 WindowPlacement wpEvalGraph;\r
 \r
 HWND engineOutputDialog = NULL;\r
-BOOLEAN engineOutputDialogUp = FALSE;\r
+int engineOutputDialogUp = FALSE;\r
 \r
 WindowPlacement wpEngineOutput;\r
 WindowPlacement wpGameList;\r
@@ -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
@@ -7186,13 +7195,8 @@ TypeInMoveDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        }\r
        // [HGM] movenum: allow move number to be typed in any mode\r
        if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
-         currentMove = 2*n-1;\r
-         if(currentMove > forwardMostMove)  currentMove = forwardMostMove;\r
-         if(currentMove < backwardMostMove) currentMove = backwardMostMove;\r
+         ToNrEvent(2*n-1);\r
          EndDialog(hDlg, TRUE);\r
-         DrawPosition(TRUE, boards[currentMove]);\r
-         if(currentMove > backwardMostMove) DisplayMove(currentMove - 1);\r
-         else DisplayMessage("", "");\r
          return TRUE;\r
        }\r
       }\r