summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-01-28 18:43:00 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-01-28 18:43:00 +0000
commit8812e92550ace1537184afb77246beb46770fd3e (patch)
treec1a3bb73eb5984d49f4f6b8f30277623ce064adc
parentf67234f1df04f274f9d9360bd62c6916d1f4878b (diff)
downloadmandoc-8812e92550ace1537184afb77246beb46770fd3e.tar.gz
.Bl -column with zero columns is legal, so don't segfalt on it.
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.
-rw-r--r--mdoc_html.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/mdoc_html.c b/mdoc_html.c
index e5ac0a2c..ff635059 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -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);