diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-14 22:02:35 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-14 22:09:50 +0000 |
| commit | 7364ce8e266d947be146d635958a7b282752aac6 (patch) | |
| tree | b6e4018669068dcca816c11dd7ab32835311c6e6 | |
| parent | 5a0a2b9166a144b1775411a47060efa483e61971 (diff) | |
| download | puzzles-7364ce8e266d947be146d635958a7b282752aac6.zip puzzles-7364ce8e266d947be146d635958a7b282752aac6.tar.gz puzzles-7364ce8e266d947be146d635958a7b282752aac6.tar.bz2 puzzles-7364ce8e266d947be146d635958a7b282752aac6.tar.xz | |
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
| -rw-r--r-- | flood.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -886,7 +886,7 @@ static game_state *execute_move(const game_state *state, const char *move) 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 @@ static game_state *execute_move(const game_state *state, const char *move) 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) { |