gbranden pushed a commit to branch master
in repository groff.

commit d445aee94ec25b9f21237acf8660d0104b89da0d
Author: G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Wed Sep 10 08:21:53 2025 -0500

    src/roff/troff/node.cpp: Add validation checks.
    
    * src/roff/troff/node.cpp: Add more `assert()`ions and validity checks
      to node classes' `asciify()` member functions, eliminate unnecessary
      statements, and more consistently delete node objects after
      `asciify`-ing them.  (The `asciify` request modifies a
      macro/string/diversion--usually a diversion--in place.)
    
      (kern_pair_node::asciify, ligature_node::asciify): `assert()` that
      each of the contained nodes is not a null pointer and do not
      recursively `asciify()` them if they are.
    
      (asciify_reverse_node_list): `assert()` that macro and node pointer
      arguments are not null, and return early if they are.
    
      (dbreak_node::asciify): `assert()` that macro pointer argument is not
      null, and do not call `asciify_reverse_node_list()` on it if it is.
      Also drop dead store (pointless assignment) to member variable just
      before deleting the object.
    
      (break_char_node::asciify, italic_corrected_node::asciify)
      (left_italic_corrected_node::asciify): `assert()` that macro pointer
      argument is not null, and do not recursively `asciify()` it if it is.
      Also drop dead store (pointless assignment) to member variable just
      before deleting the object.
---
 ChangeLog               | 23 +++++++++++++++++++++++
 src/roff/troff/node.cpp | 40 ++++++++++++++++++++++++++--------------
 2 files changed, 49 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e7d2cf008..0d0fe83d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2025-09-09  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+       * src/roff/troff/node.cpp: Add more `assert()`ions and validity
+       checks to node classes' `asciify()` member functions, eliminate
+       unnecessary statements, and more consistently delete node
+       objects after `asciify`-ing them.  (The `asciify` request
+       modifies a macro/string/diversion--usually a diversion--in
+       place.)
+       (kern_pair_node::asciify, ligature_node::asciify): `assert()`
+       that each of the contained nodes is not a null pointer and do
+       not recursively `asciify()` them if they are.
+       (asciify_reverse_node_list): `assert()` that macro and node
+       pointer arguments are not null, and return early if they are.
+       (dbreak_node::asciify): `assert()` that macro pointer argument
+       is not null, and do not call `asciify_reverse_node_list()` on it
+       if it is.  Also drop dead store (pointless assignment) to member
+       variable just before deleting the object.
+       (break_char_node::asciify, italic_corrected_node::asciify)
+       (left_italic_corrected_node::asciify): `assert()` that macro
+       pointer argument is not null, and do not recursively `asciify()`
+       it if it is.  Also drop dead store (pointless assignment) to
+       member variable just before deleting the object.
+
 2025-09-09  G. Branden Robinson <g.branden.robin...@gmail.com>
 
        * src/roff/troff/node.cpp (class charinfo_node): Make class more
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index e5bdb6100..9665d0581 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -3904,15 +3904,21 @@ void glyph_node::asciify(macro *m)
 
 void kern_pair_node::asciify(macro *m)
 {
-  n1->asciify(m);
-  n2->asciify(m);
+  assert(n1 != 0 /* nullptr */);
+  assert(n2 != 0 /* nullptr */);
+  if (n1 != 0 /* nullptr */)
+    n1->asciify(m);
+  if (n2 != 0 /* nullptr */)
+    n2->asciify(m);
   n1 = n2 = 0 /* nullptr */;
   delete this;
 }
 
 static void asciify_reverse_node_list(macro *m, node *n)
 {
-  if (0 /* nullptr */ == n)
+  assert(m != 0 /* nullptr */);
+  assert(n != 0 /* nullptr */);
+  if ((0 /* nullptr */ == m) || (0 /* nullptr */ == n))
     return;
   asciify_reverse_node_list(m, n->next);
   n->asciify(m);
@@ -3920,39 +3926,45 @@ static void asciify_reverse_node_list(macro *m, node *n)
 
 void dbreak_node::asciify(macro *m)
 {
-  asciify_reverse_node_list(m, none);
-  none = 0 /* nullptr */;
+  assert(m != 0 /* nullptr */);
+  if (m != 0 /* nullptr */)
+    asciify_reverse_node_list(m, none);
   delete this;
 }
 
 void ligature_node::asciify(macro *m)
 {
-  n1->asciify(m);
-  n2->asciify(m);
+  assert(n1 != 0 /* nullptr */);
+  assert(n2 != 0 /* nullptr */);
+  if (n1 != 0 /* nullptr */)
+    n1->asciify(m);
+  if (n2 != 0 /* nullptr */)
+    n2->asciify(m);
   n1 = n2 = 0 /* nullptr */;
   delete this;
 }
 
 void break_char_node::asciify(macro *m)
 {
-  nodes->asciify(m);
-  nodes = 0 /* nullptr */;
+  assert(nodes != 0 /* nullptr */);
+  if (nodes != 0 /* nullptr */)
+    nodes->asciify(m);
   delete this;
 }
 
 void italic_corrected_node::asciify(macro *m)
 {
-  nodes->asciify(m);
-  nodes = 0 /* nullptr */;
+  assert(nodes != 0 /* nullptr */);
+  if (nodes != 0 /* nullptr */)
+    nodes->asciify(m);
   delete this;
 }
 
 void left_italic_corrected_node::asciify(macro *m)
 {
-  if (nodes != 0 /* nullptr */) {
+  assert(nodes != 0 /* nullptr */);
+  if (nodes != 0 /* nullptr */)
     nodes->asciify(m);
-    nodes = 0 /* nullptr */;
-  }
   delete this;
 }
 

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

Reply via email to