gbranden pushed a commit to branch master
in repository groff.

commit 21c8b8e7497e9e4c3511baf7eb55525fba0241d0
Author: G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Thu Jul 10 20:58:38 2025 -0500

    [troff]: Catch `std::bad_alloc` exceptions (1/3).
    
    ...from `new` operator.  Throw a fatal error indicating how much memory
    we couldn't allocate.
    
    * src/roff/troff/input.cpp (read_long_escape_parameters): Do it.
    
    Exhibit:
    
    $ { printf '\\['; dd if=/dev/zero of=/dev/stdout bs=1M count=1024 \
        | tr '\0' 'a'; printf ']\n'; } | ./build/test-groff -z
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.3334 s, 87.1 MB/s
    troff:<standard input>:1: fatal error: cannot allocate 1073741824 bytes to 
read input line
---
 ChangeLog                |  8 ++++++++
 src/roff/troff/input.cpp | 24 +++++++++++++++++++-----
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fd18e1893..8f3261114 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2025-07-10  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+       [troff]: Catch `std::bad_alloc` exceptions from `new` operator.
+       Throw a fatal error indicating how much memory we couldn't
+       allocate.
+
+       * src/roff/troff/input.cpp (read_long_escape_parameters): Do it.
+
 2025-07-10  G. Branden Robinson <g.branden.robin...@gmail.com>
 
        * src/roff/troff/input.cpp: Refactor to simplify.  As an
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index 4275e9f87..5245ef72e 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -996,7 +996,15 @@ static symbol read_long_escape_parameters(read_mode mode)
 {
   int start_level = input_stack::get_level();
   int buf_size = default_buffer_size;
-  char *buf = new char[buf_size];
+  char *buf = 0 /* nullptr */;
+  try {
+    // C++03: new char[buf_size]();
+    buf = new char[buf_size];
+  }
+  catch (const std::bad_alloc &e) {
+    fatal("cannot allocate %1 bytes to read input line", buf_size);
+  }
+  (void) memset(buf, 0, (buf_size * sizeof(char)));
   int i = 0;
   char c;
   bool have_char = false;
@@ -1011,11 +1019,17 @@ static symbol read_long_escape_parameters(read_mode 
mode)
       break;
     if (i + 2 > buf_size) {
       char *old_buf = buf;
-      // C++03: new char[buf_size * 2]();
-      buf = new char[buf_size * 2];
-      (void) memset(buf, 0, (buf_size * 2 * sizeof(char)));
+      int new_buf_size = buf_size * 2;
+      // C++03: new char[new_buf_size]();
+      try {
+       buf = new char[new_buf_size];
+      }
+      catch (const std::bad_alloc &e) {
+       fatal("cannot allocate %1 bytes to read input line", buf_size);
+      }
+      (void) memset(buf, 0, (new_buf_size * sizeof(char)));
       memcpy(buf, old_buf, buf_size);
-      buf_size *= 2;
+      buf_size = new_buf_size;
       delete[] old_buf;
     }
     if ((']' == c) && (input_stack::get_level() == start_level))

_______________________________________________
groff-commit mailing list
groff-commit@gnu.org
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to