shithub: puzzles

Download patch

ref: 71cf891fdc3ab237ecf0e5d1aae39b6c9fe97a4d
parent: a4c6f21b8e286322d3c1820785907a000fe1092f
author: Ben Harris <bjh21@bjh21.me.uk>
date: Tue Feb 14 08:16:53 EST 2023

Don't allow zero clues in Pattern

Some nonogram implementations allow zero clues so that a row or column
with a single zero clue is equivalent to one with no clues, that is it
has no black squares in it.  Pattern, however, doesn't interpret them
like this and treats a puzzle with a zero clue as insoluble, so it's
not helpful to permit them.

Permitting zero clues also confuses Pattern's memory allocation so
that it can suffer a buffer overrun.  As an example, before this
commit a build with AddressSanitizer would report a buffer overrun
with the description "1:0/0.0" because it tries to put two clues in a
row that can have a maximum of one.

--- a/pattern.c
+++ b/pattern.c
@@ -917,8 +917,8 @@
                 p = desc;
                 while (*desc && isdigit((unsigned char)*desc)) desc++;
                 n = atoi(p);
-                if (n < 0)
-                    return "at least one clue is negative";
+                if (n <= 0)
+                    return "all clues must be positive";
                 if (n > INT_MAX - 1)
                     return "at least one clue is grossly excessive";
                 rowspace -= n+1;