shithub: puzzles

Download patch

ref: 1bab1d1d2ab472bb8fc7cddfce1d3c37e63a2ed5
parent: 02e5e93046d1ee2ce7acde629a6562db9b36fa5d
author: Ben Harris <[email protected]>
date: Sun Oct 16 15:14:24 EDT 2022

Correct and enable the range check on statepos when loading

statepos == 0 shouldn't ever occur in a save file because it indicates
an uninitialised midend.  OTOH statepos == nstates is normal.  Also
added an equivalent assertion when saving because Simon and I spent
some time discussing whether it could happen.

--- a/midend.c
+++ b/midend.c
@@ -2091,6 +2091,7 @@
         char buf[80];
         sprintf(buf, "%d", me->nstates);
         wr("NSTATES", buf);
+        assert(me->statepos >= 1 && me->statepos <= me->nstates);
         sprintf(buf, "%d", me->statepos);
         wr("STATEPOS", buf);
     }
@@ -2345,8 +2346,9 @@
         ret = "Game private description in save file is invalid";
         goto cleanup;
     }
-    if (data.statepos < 0 || data.statepos >= data.nstates) {
+    if (data.statepos < 1 || data.statepos > data.nstates) {
         ret = "Game position in save file is out of range";
+        goto cleanup;
     }
 
     if (!data.states) {