shithub: puzzles

Download patch

ref: 17364455186ae61e015d0f0de3f09423f78d0727
parent: 37df1f2bbc689d224369d963dd8007d68fcd7c6a
author: Ben Harris <bjh21@bjh21.me.uk>
date: Wed Feb 1 12:07:12 EST 2023

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.

--- a/mines.c
+++ b/mines.c
@@ -2701,7 +2701,9 @@
 	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 &&