From 17364455186ae61e015d0f0de3f09423f78d0727 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Wed, 1 Feb 2023 17:07:12 +0000 Subject: [PATCH] Mines: forbid moves that flag or unflag an exposed square interpret_move() couldn't generate them, but execute_move() also needs to forbid them to defend against corrupt save files. I don't think this actually caused any crashes, but it did cause unexpected "1" squares not adjacent to mines. --- mines.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mines.c b/mines.c index 711fc50..d40bb9f 100644 --- a/mines.c +++ b/mines.c @@ -2701,7 +2701,9 @@ static game_state *execute_move(const game_state *from, const char *move) while (*move) { if (move[0] == 'F' && sscanf(move+1, "%d,%d", &cx, &cy) == 2 && - cx >= 0 && cx < from->w && cy >= 0 && cy < from->h) { + cx >= 0 && cx < from->w && cy >= 0 && cy < from->h && + (ret->grid[cy * from->w + cx] == -1 || + ret->grid[cy * from->w + cx] == -2)) { ret->grid[cy * from->w + cx] ^= (-2 ^ -1); } else if (move[0] == 'O' && sscanf(move+1, "%d,%d", &cx, &cy) == 2 &&