From ed682bd5c608156d12ebaa2d84c4ce2e2877c10a Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Thu, 2 Feb 2023 21:58:10 +0000 Subject: [PATCH] Tighten validation of Tents game descriptions Specifically, TENT and NONTENT markers ('!' and '-') cannot appear as the first or last character of a description, because that would attempt to place them on squares outside the grid. This was caught by assertions in new_game(), as can be demonstrated by feeding these descriptions to older versions of Tents: "4:-p,0,0,0,0,0,0,0,0" ("new_game: Assertion `i >= 0 && i <= w*h' failed.") and 4:p-,0,0,0,0,0,0,0,0 ("new_game: Assertion `*desc == ','' failed."). --- tents.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tents.c b/tents.c index 9e8349c..f08a0e3 100644 --- a/tents.c +++ b/tents.c @@ -1191,6 +1191,21 @@ static char *new_game_desc(const game_params *params_in, random_state *rs, return ret; } +/* + * Grid description format: + * + * _ = tree + * a = 1 BLANK then TREE + * ... + * y = 25 BLANKs then TREE + * z = 25 BLANKs + * ! = set previous square to TENT + * - = set previous square to NONTENT + * + * Last character must be one that would insert a tree as the first + * square after the grid. + */ + static const char *validate_desc(const game_params *params, const char *desc) { int w = params->w, h = params->h; @@ -1204,9 +1219,10 @@ static const char *validate_desc(const game_params *params, const char *desc) area += *desc - 'a' + 2; else if (*desc == 'z') area += 25; - else if (*desc == '!' || *desc == '-') - /* do nothing */; - else + else if (*desc == '!' || *desc == '-') { + if (area == 0 || area > w * h) + return "Tent or non-tent placed off the grid"; + } else return "Invalid character in grid specification"; desc++;