shithub: puzzles

Download patch

ref: 7364ce8e266d947be146d635958a7b282752aac6
parent: 5a0a2b9166a144b1775411a47060efa483e61971
author: Ben Harris <[email protected]>
date: Tue Feb 14 17:02:35 EST 2023

Make sure that moves in Flood use only valid colours

If execute_move() receieves a move that uses a colour beyond the range
for the current game, it now rejects it.  Without this a solve string
containing an invalid colour would cause an assertion failure: "fill:
Assertion `oldcolour != newcolour' failed."  While I was in the area I
put a range check on colours for normal moves as well.  To demonstrate
the problem, load this save file:

SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
VERSION :1:1
GAME    :5:Flood
PARAMS  :7:6x6c6m5
CPARAMS :7:6x6c6m3
DESC    :39:432242034203340350204502505323231342,17
NSTATES :1:2
STATEPOS:1:2
MOVE    :2:S6

--- a/flood.c
+++ b/flood.c
@@ -886,7 +886,7 @@
 
     if (move[0] == 'M' &&
         sscanf(move+1, "%d", &c) == 1 &&
-        c >= 0 &&
+        c >= 0 && c < state->colours &&
         c != state->grid[FILLY * state->w + FILLX] &&
         !state->complete) {
         int *queue = snewn(state->w * state->h, int);
@@ -945,10 +945,12 @@
                 return NULL;
             };
             sol->moves[i] = atoi(p);
-            if (i == 0 ?
-                sol->moves[i] == state->grid[FILLY * state->w + FILLX] :
-                sol->moves[i] == sol->moves[i-1])
-                /* Solution contains a fill with the current colour. */
+            if (sol->moves[i] < 0 || sol->moves[i] >= state->colours ||
+                (i == 0 ?
+                 sol->moves[i] == state->grid[FILLY * state->w + FILLX] :
+                 sol->moves[i] == sol->moves[i-1]))
+                /* Solution contains a fill with an invalid colour or
+                 * the current colour. */
                 goto badsolve;
             p += strspn(p, "0123456789");
             if (*p) {