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
This commit is contained in:
Ben Harris
2023-02-15 14:07:34 +00:00
parent 7364ce8e26
commit 9394e9c74b

View File

@ -265,7 +265,14 @@ static const char *validate_params(const game_params *params, bool full)
return "Width and height must both be at least one"; return "Width and height must both be at least one";
if (params->w > SHRT_MAX || params->h > SHRT_MAX) if (params->w > SHRT_MAX || params->h > SHRT_MAX)
return "Neither width nor height may be unreasonably large"; 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) if (params->w > INT_MAX / params->h)
#endif
return "Width times height must not be unreasonably large"; return "Width times height must not be unreasonably large";
if (params->n < 0) if (params->n < 0)
return "Mine count may not be negative"; return "Mine count may not be negative";