aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Harris <bjh21@bjh21.me.uk>2023-02-13 00:14:22 +0000
committerBen Harris <bjh21@bjh21.me.uk>2023-02-13 21:05:32 +0000
commitdf783b93e3271264a8d54f90876f41a80ef2247d (patch)
tree90475f6b7621267e5629682abc33e291b1a00130
parentda2767a3f9bf4abb0436157972366202ad53a407 (diff)
downloadpuzzles-df783b93e3271264a8d54f90876f41a80ef2247d.zip
puzzles-df783b93e3271264a8d54f90876f41a80ef2247d.tar.gz
puzzles-df783b93e3271264a8d54f90876f41a80ef2247d.tar.bz2
puzzles-df783b93e3271264a8d54f90876f41a80ef2247d.tar.xz
Avoid division by zero in Cube grid-size checks
On a triangular grid, Cube allows either d1 or d2 (but not both) to be zero, so it's important to check that each one is not zero before dividing by it. The crash could be triggered by, for instance "cube t0x2".
-rw-r--r--cube.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/cube.c b/cube.c
index 1969bfb..99f392a 100644
--- a/cube.c
+++ b/cube.c
@@ -567,9 +567,11 @@ static const char *validate_params(const game_params *params, bool full)
* can safely multiply them and compare against the
* _remaining_ space.
*/
- if ((params->d1 > INT_MAX / params->d1) ||
- (params->d2 > (INT_MAX - params->d1*params->d1) / params->d2) ||
- (params->d1*params->d2 > (INT_MAX - params->d1*params->d1 -
+ if ((params->d1 > 0 && params->d1 > INT_MAX / params->d1) ||
+ (params->d2 > 0 &&
+ params->d2 > (INT_MAX - params->d1*params->d1) / params->d2) ||
+ (params->d2 > 0 &&
+ params->d1*params->d2 > (INT_MAX - params->d1*params->d1 -
params->d2*params->d2) / params->d2))
return "Grid area must not be unreasonably large";
}