.Bl -column with zero columns is legal, so don't segfalt on it.
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 28 Jan 2017 18:43:00 +0000 (18:43 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 28 Jan 2017 18:43:00 +0000 (18:43 +0000)
Bug introduced in rev. 1.248 triggered for example in gssapi(3),
analyzed and reported by Michael <Stapelberg at debian dot org>.
Simplify the code a bit more while here.

mdoc_html.c

index ea9c055045a0368f34e81392cfcd91ab4b212381..8bb15a2528f9fbeae9e59be175e8320c37b7fd18 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.261 2017/01/25 02:14:43 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.262 2017/01/28 18:43:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -817,18 +817,21 @@ mdoc_it_pre(MDOC_ARGS)
 static int
 mdoc_bl_pre(MDOC_ARGS)
 {
+       struct mdoc_bl  *bl;
        const char      *cattr;
-       int              i;
+       size_t           i;
        enum htmltag     elemtype;
 
+       bl = &n->norm->Bl;
+
        if (n->type == ROFFT_BODY) {
-               if (LIST_column == n->norm->Bl.type)
+               if (bl->type == LIST_column)
                        print_otag(h, TAG_TBODY, "");
                return 1;
        }
 
        if (n->type == ROFFT_HEAD) {
-               if (LIST_column != n->norm->Bl.type)
+               if (bl->type != LIST_column || bl->ncols == 0)
                        return 0;
 
                /*
@@ -838,14 +841,13 @@ mdoc_bl_pre(MDOC_ARGS)
                 * screen and we want to preserve that behaviour.
                 */
 
-               for (i = 0; i < (int)n->norm->Bl.ncols - 1; i++)
-                       print_otag(h, TAG_COL, "sww", n->norm->Bl.cols[i]);
-               print_otag(h, TAG_COL, "swW", n->norm->Bl.cols[i]);
-
+               for (i = 0; i < bl->ncols - 1; i++)
+                       print_otag(h, TAG_COL, "sww", bl->cols[i]);
+               print_otag(h, TAG_COL, "swW", bl->cols[i]);
                return 0;
        }
 
-       switch (n->norm->Bl.type) {
+       switch (bl->type) {
        case LIST_bullet:
                elemtype = TAG_UL;
                cattr = "Bl-bullet";
@@ -881,14 +883,12 @@ mdoc_bl_pre(MDOC_ARGS)
                break;
        case LIST_tag:
                cattr = "Bl-tag";
-               if (n->norm->Bl.offs)
-                       print_otag(h, TAG_DIV, "cswl", cattr,
-                           n->norm->Bl.offs);
-               if (n->norm->Bl.width == NULL)
+               if (bl->offs)
+                       print_otag(h, TAG_DIV, "cswl", cattr, bl->offs);
+               if (bl->width == NULL)
                        print_otag(h, TAG_DL, "c", cattr);
                else
-                       print_otag(h, TAG_DL, "cswl", cattr,
-                           n->norm->Bl.width);
+                       print_otag(h, TAG_DL, "cswl", cattr, bl->width);
                return 1;
        case LIST_column:
                elemtype = TAG_TABLE;
@@ -898,8 +898,8 @@ mdoc_bl_pre(MDOC_ARGS)
                abort();
        }
 
-       if (n->norm->Bl.offs)
-               print_otag(h, elemtype, "cswl", cattr, n->norm->Bl.offs);
+       if (bl->offs)
+               print_otag(h, elemtype, "cswl", cattr, bl->offs);
        else
                print_otag(h, elemtype, "c", cattr);