aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Harris <bjh21@bjh21.me.uk>2022-10-16 19:14:24 +0100
committerBen Harris <bjh21@bjh21.me.uk>2022-10-16 19:15:40 +0100
commit1bab1d1d2ab472bb8fc7cddfce1d3c37e63a2ed5 (patch)
tree161c0679f2b9ebb3082978eeca0401e058dcf708
parent02e5e93046d1ee2ce7acde629a6562db9b36fa5d (diff)
downloadpuzzles-1bab1d1d2ab472bb8fc7cddfce1d3c37e63a2ed5.zip
puzzles-1bab1d1d2ab472bb8fc7cddfce1d3c37e63a2ed5.tar.gz
puzzles-1bab1d1d2ab472bb8fc7cddfce1d3c37e63a2ed5.tar.bz2
puzzles-1bab1d1d2ab472bb8fc7cddfce1d3c37e63a2ed5.tar.xz
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.
-rw-r--r--midend.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/midend.c b/midend.c
index 10f6810..175b6f1 100644
--- a/midend.c
+++ b/midend.c
@@ -2091,6 +2091,7 @@ void midend_serialise(midend *me,
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 @@ static const char *midend_deserialise_internal(
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) {