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.
This commit is contained in:
Ben Harris
2022-10-16 19:14:24 +01:00
parent 02e5e93046
commit 1bab1d1d2a

View File

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