bug-groff
[Top][All Lists]
Advanced

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

[bug #61748] [grohtml] infinite loop


From: G. Branden Robinson
Subject: [bug #61748] [grohtml] infinite loop
Date: Thu, 30 Dec 2021 16:32:37 -0500 (EST)
User-agent: Lynx/2.8.9rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/3.6.7

URL:
  <https://savannah.gnu.org/bugs/?61748>

                 Summary: [grohtml] infinite loop
                 Project: GNU troff
            Submitted by: gbranden
            Submitted on: Thu 30 Dec 2021 09:32:35 PM UTC
                Category: Device grohtml
                Severity: 4 - Important
              Item Group: Crash/Not responding
                  Status: In Progress
                 Privacy: Public
             Assigned to: gbranden
             Open/Closed: Open
         Discussion Lock: Any
         Planned Release: None

    _______________________________________________________

Details:

The following commit exposed an infinite loop in post-grohtml.


commit c71b4ef4aa46f9264751df37ffac4fdf796c45eb
Author: G. Branden Robinson <g.branden.robinson@gmail.com>
Date:   Tue Jul 27 00:10:49 2021 +1000

    [grohtml]: Fix Savannah #60971.

    * src/preproc/html/pre-html.cpp (makeFileName): Consistently put a dash
      at the end of `macroset_template` whether the image file name stem is
      user-supplied or the default.  Stop adding the dash before the image
      number in `image_template` instead.  This makes the image file name
      format reliable whether the image needs to be subdivided (eqn) or not
      (tbl).

    Fixes <https://savannah.gnu.org/bugs/?60971>.


However, as the eventual root-cause analysis established, this was not
the fault of the above change.  What the above change (to the
pre-grohtml _preprocessor_, mind you) did seem to do was cause a
reorganization of storage later such that a read from uninitialized
memory led to a highly undesirable default point size.

Because this sort of thing can be system-dependent, I can't promise that
this is a reproducer for everyone, but it was for me.

Input:


.EQ
gsize 12
delim $$
.EN
.pp
.pp
The faster clocks are $ PN $


You _do_ need the gsize eqn directive, you _do_ need to use delimiters,
you _do_ need the extra paragraph tag, and you _do_ need the inline
eqn input.  (This is an extremely reduced version of our source tree's
grnexmpl.me, which is how I noticed the problem in the first place.)

Reproduce with:


./build/test-groff -b -ww -Thtml -eg -me EXPERIMENTS/gurn.me


As I said, I can't promise that others will be able to reproduce this,
but it was highly reliable on my x86-64 Debian bullseye system.

Here's the fix, if you don't believe me.


$ git diff
diff --git a/src/devices/grohtml/post-html.cpp
b/src/devices/grohtml/post-html.cpp
index a1018e19a..5be5e9979 100644
--- a/src/devices/grohtml/post-html.cpp
+++ b/src/devices/grohtml/post-html.cpp
@@ -324,7 +324,7 @@ struct style {
 };
 
 style::style()
-  : f(NULL)
+  : f(NULL), point_size(-1)
 {
 }


I leave as an exercise for the reader the determination of why the value
-1 is meaningful.

I had thought that argument-less constructors that don't initialize all
the fields of their objects were considered bad C++ style. (?)





    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?61748>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/




reply via email to

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