gbranden pushed a commit to branch master
in repository groff.
commit f0668fcbb70f7a126a07c761706610b3c42bda51
Author: G. Branden Robinson <[email protected]>
AuthorDate: Sun Feb 23 17:48:16 2025 -0600
[troff]: Improve `file_iterator`'s memory mgmt.
* src/roff/troff/input.cpp (class file_iterator): Make class manage its
own memory for storing file names, instead of reusing externally
managed pointers (which sometimes refer to statically allocated
storage, as with "-" representing the standard input stream).
De-`const` `filename` member variable.
(file_iterator::file_iterator): Constructor now uses strdup(3) to copy
the supplied file name instead of just a pointer to it via the
initializer list. (In C++, tastes differ whether a constructor should
call [non-virtual] member functions. In this case, I don't.)
(file_iterator::next_file): Call member function `set_location()`
instead of manipulating member variables, to ensure reliable memory
management.
(file_iterator::set_location): Use strdup(3) to allocate storage for
the file name and use the returned pointer. If the file name pointer
is not null, free(3) it first.
---
ChangeLog | 19 +++++++++++++++++++
src/roff/troff/input.cpp | 21 +++++++++++++--------
2 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 758a72866..a4d0b4926 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2025-02-23 G. Branden Robinson <[email protected]>
+
+ * src/roff/troff/input.cpp (class file_iterator): Make class
+ manage its own memory for storing file names, instead of reusing
+ externally managed pointers (which sometimes refer to statically
+ allocated storage, as with "-" representing the standard input
+ stream). De-`const` `filename` member variable.
+ (file_iterator::file_iterator): Constructor now uses strdup(3)
+ to copy the supplied file name instead of just a pointer to it
+ via the initializer list. (In C++, tastes differ whether a
+ constructor should call [non-virtual] member functions. In this
+ case, I don't.)
+ (file_iterator::next_file): Call member function
+ `set_location()` instead of manipulating member variables, to
+ ensure reliable memory management.
+ (file_iterator::set_location): Use strdup(3) to allocate storage
+ for the file name and use the returned pointer. If the file
+ name pointer is not null, free(3) it first.
+
2025-02-22 G. Branden Robinson <[email protected]>
* src/libs/libgroff/font.cpp: Include "string.h" standard header
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index f67090bef..2b1f0faff 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -397,7 +397,7 @@ public:
class file_iterator : public input_iterator {
FILE *fp;
int lineno;
- const char *filename;
+ char *filename;
bool was_popened;
bool seen_newline;
bool seen_escape;
@@ -418,9 +418,10 @@ public:
};
file_iterator::file_iterator(FILE *f, const char *fn, bool popened)
-: fp(f), lineno(1), filename(fn), was_popened(popened),
+: fp(f), lineno(1), was_popened(popened),
seen_newline(false), seen_escape(false)
{
+ filename = strdup(const_cast<char *>(fn));
if ((font::use_charnames_in_special) && (fn != 0 /* nullptr */)) {
if (!the_output)
init_output();
@@ -446,9 +447,8 @@ void file_iterator::close()
bool file_iterator::next_file(FILE *f, const char *s)
{
close();
- filename = s;
fp = f;
- lineno = 1;
+ set_location(s, 1);
seen_newline = false;
seen_escape = false;
was_popened = false;
@@ -528,8 +528,13 @@ void file_iterator::backtrace()
bool file_iterator::set_location(const char *f, int ln)
{
- if (f != 0 /* nullptr */)
- filename = f;
+ if (f != 0 /* nullptr */) {
+ if (filename != 0 /* nullptr */) {
+ free(filename);
+ filename = 0 /* nullptr */;
+ }
+ filename = strdup(const_cast<char *>(f));
+ }
lineno = ln;
return true;
}
@@ -8556,7 +8561,7 @@ void abort_request()
// The caller must subsequently call `tok.next()` to advance the input
// stream pointer.
//
-// The caller has responsibility for freeing the returned array.
+// The caller has responsibility for `delete`ing the returned array.
char *read_string()
{
int len = 256;
@@ -9850,7 +9855,7 @@ static void do_error(error_type type,
input_stack::backtrace();
if (!get_file_line(&filename, &lineno))
filename = 0 /* nullptr */;
- if (filename) {
+ if (filename != 0 /* nullptr */) {
if (program_name)
errprint("%1:", program_name);
errprint("%1:%2: ", filename, lineno);
_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit