gbranden pushed a commit to branch master in repository groff. commit 254b4d8d6f2beb8d368fd7cc02d460ed936ffddc Author: G. Branden Robinson <g.branden.robin...@gmail.com> AuthorDate: Thu Jul 10 16:53:54 2025 -0500
[pre-grohtml]: Handle memory exhaustion. * src/preproc/html/pre-html.cpp (get_line): Catch `std::bad_alloc` exceptions from `new` operator. Throw a fatal error indicating how much memory we couldn't allocate and which line of which file we were reading when we had trouble. Exhibit: $ rm build/font/devps/DESC $ make -C build font/devps/DESC [output elided] $ printf 'papersize ' >> build/font/devps/DESC $ dd if=/dev/zero of=/dev/stdout bs=1M count=8192 \ | tr '\0' '@' >> build/font/devps/DESC [output elided] $ printf '\n' >> build/font/devps/DESC $ make -C build GROFF doc/pic.html pre-grohtml:.../build/font/devps/DESC:15: fatal error: cannot allocate more than 1073741824 bytes to read line; aborting And with that, groff takes another step away from Annotated Reference Manual C++ and into the bleeding-edge horizons of ISO C++98. --- ChangeLog | 7 +++++++ src/preproc/html/pre-html.cpp | 20 ++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7d7335f4c..3166a5a3a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2025-07-10 G. Branden Robinson <g.branden.robin...@gmail.com> + + * src/preproc/html/pre-html.cpp (get_line): Catch + `std::bad_alloc` exceptions from `new` operator. Throw a fatal + error indicating how much memory we couldn't allocate and which + line of which file we were reading when we had trouble. + 2025-07-10 G. Branden Robinson <g.branden.robin...@gmail.com> * src/preproc/html/pre-html.cpp (get_resolution) diff --git a/src/preproc/html/pre-html.cpp b/src/preproc/html/pre-html.cpp index 70dc18ba0..f3d6e4780 100644 --- a/src/preproc/html/pre-html.cpp +++ b/src/preproc/html/pre-html.cpp @@ -36,6 +36,8 @@ #include <getopt.h> // getopt_long() +#include <new> // std::bad_alloc + // needed for close(), creat(), dup(), dup2(), execvp(), fork(), // getpid(), mkdir(), open(), pipe(), unlink(), wait(), write() #include "posix.h" @@ -268,7 +270,14 @@ static bool get_line(FILE *f, const char *file_name, int lineno) return false; if (0 /* nullptr */ == linebuf) { linebufsize = 128; - linebuf = new char[linebufsize]; + try { + linebuf = new char[linebufsize]; + } + catch (std::bad_alloc &e) { + fatal_with_file_and_line(file_name, lineno, "cannot allocate %1" + " bytes to read line; aborting", + linebufsize); + } } int i = 0; // skip leading whitespace @@ -288,7 +297,14 @@ static bool get_line(FILE *f, const char *file_name, int lineno) if (i + 1 >= linebufsize) { int newbufsize = linebufsize * 2; char *old_linebuf = linebuf; - linebuf = new char[newbufsize]; + try { + linebuf = new char[newbufsize]; + } + catch (std::bad_alloc &e) { + fatal_with_file_and_line(file_name, lineno, "cannot allocate" + " more than %1 bytes to read line;" + " aborting", linebufsize); + } memcpy(linebuf, old_linebuf, linebufsize); delete[] old_linebuf; linebufsize = newbufsize; _______________________________________________ groff-commit mailing list groff-commit@gnu.org https://lists.gnu.org/mailman/listinfo/groff-commit