I have encountered one more issue:

% curl -s https://manpages.debian.org/testing/mysql-server-5.6/mysqlbinlog.1.en.gz | ./mandoc -Thtml
[…]
free(): invalid pointer

Could you take a look at that, too, please?

Thank you,

On Sat, May 25, 2019 at 5:22 PM Michael Stapelberg <stapelberg@debian.org> wrote:
Yeah, that commit indeed fixes it. Thank you!

On Tue, Apr 30, 2019 at 6:08 PM Ingo Schwarze <schwarze@usta.de> wrote:
Hi Michael,

Michael Stapelberg wrote on Sun, Apr 28, 2019 at 03:24:51PM +0200:

> Sorry for the late reply on this,

I appreciate that you are testing mandoc quite regularly.
It is only natural that not every point in time can be convenient
for doing such work.

> but I only now got a chance to (try to)
> update manpages.debian.org to mandoc-1.14.5.
>
> Unfortunately, I encounter an assertion failure when running:
> % curl -s
> https://manpages.debian.org/testing/libpcp3-dev/pmRegisterDerived.3.en.gz |
> mandoc -Thtml
> mandoc: html.c:809: print_text: Assertion `NULL == h->metaf' failed.

I fear i broke that as a side effect of the changes made for this
NEWS entry: "roff(7) .ft request: handle the CB, CI, and CR fonts".

The fix is slightly larger than i would like for a regression fix,
but it can't be helped because it requires splitting the function
print_metaf() into two parts.

Then again, i like bugfixes that reduce the amount of code,
and this one shortens the code by about 25 lines...

I believe the commit below fixes the regression.
Does it work for you, too?

Thanks,
  Ingo


Log Message:
-----------
In HTML output, allow switching the desired font for subsequent
text without printing an opening tag right away, and use that in
the .ft request handler.  While here, garbage collect redundant
enum htmlfont and reduce code duplication in print_text().
Fixing an assertion failure reported by Michael <Stapelberg at Debian>
in pmRegisterDerived(3) from libpcp3-dev.

Modified Files:
--------------
    mandoc:
        html.c
        html.h
        man_html.c
        roff_html.c
    mandoc/regress/roff/ft:
        badargs.out_html

Revision Data
-------------
Index: man_html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/man_html.c,v
retrieving revision 1.173
retrieving revision 1.174
diff -Lman_html.c -Lman_html.c -u -p -r1.173 -r1.174
--- man_html.c
+++ man_html.c
@@ -203,9 +203,9 @@ print_man_node(MAN_ARGS)
                 * Close out scope of font prior to opening a macro
                 * scope.
                 */
-               if (HTMLFONT_NONE != h->metac) {
+               if (h->metac != ESCAPE_FONTROMAN) {
                        h->metal = h->metac;
-                       h->metac = HTMLFONT_NONE;
+                       h->metac = ESCAPE_FONTROMAN;
                }

                /*
Index: html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/html.c,v
retrieving revision 1.254
retrieving revision 1.255
diff -Lhtml.c -Lhtml.c -u -p -r1.254 -r1.255
--- html.c
+++ html.c
@@ -120,6 +120,7 @@ static      void     print_ctag(struct html *, s
 static int      print_escape(struct html *, char);
 static int      print_encode(struct html *, const char *, const char *, int);
 static void     print_href(struct html *, const char *, const char *, int);
+static void     print_metaf(struct html *);


 void *
@@ -222,55 +223,49 @@ print_gen_head(struct html *h)
        print_tagq(h, t);
 }

-void
-print_metaf(struct html *h, enum mandoc_esc deco)
+int
+html_setfont(struct html *h, enum mandoc_esc font)
 {
-       enum htmlfont    font;
-
-       switch (deco) {
+       switch (font) {
        case ESCAPE_FONTPREV:
                font = h->metal;
                break;
        case ESCAPE_FONTITALIC:
-               font = HTMLFONT_ITALIC;
-               break;
        case ESCAPE_FONTBOLD:
-               font = HTMLFONT_BOLD;
-               break;
        case ESCAPE_FONTBI:
-               font = HTMLFONT_BI;
-               break;
        case ESCAPE_FONTCW:
-               font = HTMLFONT_CW;
+       case ESCAPE_FONTROMAN:
                break;
        case ESCAPE_FONT:
-       case ESCAPE_FONTROMAN:
-               font = HTMLFONT_NONE;
+               font = ESCAPE_FONTROMAN;
                break;
        default:
-               return;
+               return 0;
        }
+       h->metal = h->metac;
+       h->metac = font;
+       return 1;
+}

+static void
+print_metaf(struct html *h)
+{
        if (h->metaf) {
                print_tagq(h, h->metaf);
                h->metaf = NULL;
        }
-
-       h->metal = h->metac;
-       h->metac = font;
-
-       switch (font) {
-       case HTMLFONT_ITALIC:
+       switch (h->metac) {
+       case ESCAPE_FONTITALIC:
                h->metaf = print_otag(h, TAG_I, "");
                break;
-       case HTMLFONT_BOLD:
+       case ESCAPE_FONTBOLD:
                h->metaf = print_otag(h, TAG_B, "");
                break;
-       case HTMLFONT_BI:
+       case ESCAPE_FONTBI:
                h->metaf = print_otag(h, TAG_B, "");
                print_otag(h, TAG_I, "");
                break;
-       case HTMLFONT_CW:
+       case ESCAPE_FONTCW:
                h->metaf = print_otag(h, TAG_SPAN, "c", "Li");
                break;
        default:
@@ -479,7 +474,8 @@ print_encode(struct html *h, const char
                case ESCAPE_FONTROMAN:
                        if (0 == norecurse) {
                                h->flags |= HTML_NOSPACE;
-                               print_metaf(h, esc);
+                               if (html_setfont(h, esc))
+                                       print_metaf(h);
                                h->flags &= ~HTML_NOSPACE;
                        }
                        continue;
@@ -806,27 +802,9 @@ print_text(struct html *h, const char *w
                        print_word(h, "&#x00A0;");
        }

-       assert(NULL == h->metaf);
-       switch (h->metac) {
-       case HTMLFONT_ITALIC:
-               h->metaf = print_otag(h, TAG_I, "");
-               break;
-       case HTMLFONT_BOLD:
-               h->metaf = print_otag(h, TAG_B, "");
-               break;
-       case HTMLFONT_BI:
-               h->metaf = print_otag(h, TAG_B, "");
-               print_otag(h, TAG_I, "");
-               break;
-       case HTMLFONT_CW:
-               h->metaf = print_otag(h, TAG_SPAN, "c", "Li");
-               break;
-       default:
-               print_indent(h);
-               break;
-       }
-
-       assert(word);
+       assert(h->metaf == NULL);
+       print_metaf(h);
+       print_indent(h);
        if ( ! print_encode(h, word, NULL, 0)) {
                if ( ! (h->flags & HTML_NONOSPACE))
                        h->flags &= ~HTML_NOSPACE;
@@ -834,7 +812,7 @@ print_text(struct html *h, const char *w
        } else
                h->flags |= HTML_NOSPACE | HTML_NONEWLINE;

-       if (h->metaf) {
+       if (h->metaf != NULL) {
                print_tagq(h, h->metaf);
                h->metaf = NULL;
        }
Index: roff_html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/roff_html.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -Lroff_html.c -Lroff_html.c -u -p -r1.19 -r1.20
--- roff_html.c
+++ roff_html.c
@@ -94,7 +94,7 @@ roff_html_pre_ft(ROFF_HTML_ARGS)
        const char      *cp;

        cp = n->child->string;
-       print_metaf(h, mandoc_font(cp, (int)strlen(cp)));
+       html_setfont(h, mandoc_font(cp, (int)strlen(cp)));
 }

 static void
Index: html.h
===================================================================
RCS file: /home/cvs/mandoc/mandoc/html.h,v
retrieving revision 1.102
retrieving revision 1.103
diff -Lhtml.h -Lhtml.h -u -p -r1.102 -r1.103
--- html.h
+++ html.h
@@ -69,15 +69,6 @@ enum htmltag {
        TAG_MAX
 };

-enum   htmlfont {
-       HTMLFONT_NONE = 0,
-       HTMLFONT_BOLD,
-       HTMLFONT_ITALIC,
-       HTMLFONT_BI,
-       HTMLFONT_CW,
-       HTMLFONT_MAX
-};
-
 struct tag {
        struct tag       *next;
        int               refcnt;
@@ -111,8 +102,8 @@ struct      html {
        char             *base_includes; /* base for include href */
        char             *style; /* style-sheet URI */
        struct tag       *metaf; /* current open font scope */
-       enum htmlfont     metal; /* last used font */
-       enum htmlfont     metac; /* current font mode */
+       enum mandoc_esc   metal; /* last used font */
+       enum mandoc_esc   metac; /* current font mode */
        int               oflags; /* output options */
 #define        HTML_FRAGMENT    (1 << 0) /* don't emit HTML/HEAD/BODY */
 #define        HTML_TOC         (1 << 1) /* emit a table of contents */
@@ -128,7 +119,6 @@ void                  roff_html_pre(struct html *, con
 void             print_gen_comment(struct html *, struct roff_node *);
 void             print_gen_decls(struct html *);
 void             print_gen_head(struct html *);
-void             print_metaf(struct html *, enum mandoc_esc);
 struct tag      *print_otag(struct html *, enum htmltag, const char *, ...);
 void             print_tagq(struct html *, const struct tag *);
 void             print_stagq(struct html *, const struct tag *);
@@ -141,3 +131,4 @@ void                  print_endline(struct html *);
 void             html_close_paragraph(struct html *);
 enum roff_tok    html_fillmode(struct html *, enum roff_tok);
 char            *html_make_id(const struct roff_node *, int);
+int              html_setfont(struct html *, enum mandoc_esc);
Index: badargs.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/roff/ft/badargs.out_html,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/roff/ft/badargs.out_html -Lregress/roff/ft/badargs.out_html -u -p -r1.2 -r1.3
--- regress/roff/ft/badargs.out_html
+++ regress/roff/ft/badargs.out_html
@@ -1,9 +1,8 @@
 BEGINTEST
 <br/>
-default font <i></i><i>italic</i> <b><i></i></b><b><i>bold italic</i></b>
-  <span class="Li"></span><span class="Li">typeqriter</span>
-  <span class="Li"></span> <span class="Li">roman</span> <b></b><b>bold</b>
-  <i></i> <i>italic</i> <b></b><b>bold</b> <b>still bold</b>
-  <i></i><i>italic</i> <i></i><i>back to bold</i> <i></i><i>back to italic</i>
+default font <i>italic</i> <b><i>bold italic</i></b>
+  <span class="Li">typeqriter</span> <span class="Li">roman</span> <b>bold</b>
+  <i>italic</i> <b>bold</b> <b>still bold</b> <i>italic</i> <i>back to bold</i>
+  <i>back to italic</i>
 <br/>
 ENDTEST


--
Best regards,
Michael


--
Best regards,
Michael