bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Fix bug in recipe line count overflow checking


From: Paul Eggert
Subject: [PATCH] Fix bug in recipe line count overflow checking
Date: Sun, 9 Oct 2022 17:17:18 -0700

Without this patch, the shell command:
awk 'BEGIN {
       print "x:"
       for (i = 0; i < 65536; i++)
         printf "\techo %d\n", i}
    ' | make -f -
incorrectly outputs only "make: 'x' is up to date."
* src/commands.c (chop_commands): Report overflow in recipe line
count when it occurs, as it's too late to report it later
when all evidence of the overflow has vanished.
Also, remove stray 'd' in diagnostic.

This overflow check is a bit tricky, as it catches three opportunities
for overflow at once.  Clearer would be to use Gnulib's idx and
stdckdint modules (both small modules easily imported) but that would
entail redoing these allocation counts with idx_t which would be a
more-extensive change.
---
 src/commands.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/commands.c b/src/commands.c
index e7c0cc87..6434aa7c 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -373,6 +373,13 @@ chop_commands (struct commands *cmds)
                 }
             }
 
+          /* Prevent overflow in nlines += 2, in nlines * sizeof (char *),
+             and in idx++.  */
+          if (idx == MIN (MIN (UINT_MAX, SIZE_MAX / sizeof (char *)) - 1,
+                          USHRT_MAX))
+            ON (fatal, &cmds->fileinfo,
+                _("Recipe has too many lines (limit %u)"), (unsigned int) idx);
+
           if (idx == nlines)
             {
               nlines += 2;
@@ -394,9 +401,6 @@ chop_commands (struct commands *cmds)
   /* Finally, set the corresponding CMDS->lines_flags elements and the
      CMDS->any_recurse flag.  */
 
-  if (nlines > USHRT_MAX)
-    ON (fatal, &cmds->fileinfo, _("Recipe has too many lines (%ud)"), nlines);
-
   cmds->ncommand_lines = (unsigned short)nlines;
   cmds->command_lines = lines;
 
-- 
2.37.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]