shithub: puzzles

Download patch

ref: 9394e9c74bdb48dc1c74693bcb41fd35f8fc743c
parent: 7364ce8e266d947be146d635958a7b282752aac6
author: Ben Harris <bjh21@bjh21.me.uk>
date: Wed Feb 15 09:07:34 EST 2023

Tighten grid-size limit in Mines

Mines uses random_upto() to decide where to place mines, and
random_upto() takes a maximum limit of 2^28-1, so limit the number of
grid squares to that (or INT_MAX if someone's still trying to build on
a 16-bit system).

This avoids an assertion failure: "random_upto: Assertion `bits < 32'
failed." which can be demonstrated by this save file:

SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
VERSION :1:1
GAME    :5:Mines
PARAMS  :5:18090
CPARAMS :5:18090
DESC    :11:r9,u,MEdff6
UI      :2:D0
TIME    :1:0
NSTATES :1:2
STATEPOS:1:2
MOVE    :4:O2,1

--- a/mines.c
+++ b/mines.c
@@ -265,7 +265,14 @@
 	return "Width and height must both be at least one";
     if (params->w > SHRT_MAX || params->h > SHRT_MAX)
         return "Neither width nor height may be unreasonably large";
+    /*
+     * We use random_upto() to place mines, and its maximum limit is 2^28-1.
+     */
+#if (1<<28)-1 < INT_MAX
+    if (params->w > ((1<<28)-1) / params->h)
+#else
     if (params->w > INT_MAX / params->h)
+#endif
         return "Width times height must not be unreasonably large";
     if (params->n < 0)
 	return "Mine count may not be negative";