summaryrefslogtreecommitdiffstats
path: root/mdoc_man.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2012-07-12 08:55:48 +0000
committerIngo Schwarze <schwarze@openbsd.org>2012-07-12 08:55:48 +0000
commitb675b3b7a26a6ab613fd579cb59ce6997de5ec6d (patch)
tree1d4a76ee1fc7c05901f0c0ca1f733216b500b087 /mdoc_man.c
parentab9b9e9be61f84a6ce42d0f856fc1df0a1874883 (diff)
downloadmandoc-b675b3b7a26a6ab613fd579cb59ce6997de5ec6d.tar.gz
Do not crash in -Tman on:
* .Fn with exactly one argument * .Bl -hang without a -width Now all 3776 OpenBSD base manuals build without crashing. OpenBSD rev. 1.33
Diffstat (limited to 'mdoc_man.c')
-rw-r--r--mdoc_man.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/mdoc_man.c b/mdoc_man.c
index 493eb938..2c03f237 100644
--- a/mdoc_man.c
+++ b/mdoc_man.c
@@ -103,7 +103,8 @@ static int pre_ux(DECL_ARGS);
static int pre_xr(DECL_ARGS);
static void print_word(const char *);
static void print_offs(const char *);
-static void print_width(const char *, const struct mdoc_node *);
+static void print_width(const char *,
+ const struct mdoc_node *, size_t);
static void print_count(int *);
static void print_node(DECL_ARGS);
@@ -363,7 +364,7 @@ print_offs(const char *v)
}
void
-print_width(const char *v, const struct mdoc_node *child)
+print_width(const char *v, const struct mdoc_node *child, size_t defsz)
{
char buf[24];
struct roffsu su;
@@ -373,7 +374,9 @@ print_width(const char *v, const struct mdoc_node *child)
chsz = (NULL != child && MDOC_TEXT == child->type) ?
strlen(child->string) : 0;
- if (a2roffsu(v, &su, SCALE_MAX)) {
+ if (NULL == v)
+ sz = defsz;
+ else if (a2roffsu(v, &su, SCALE_MAX)) {
if (SCALE_EN == su.unit)
sz = su.scale;
else {
@@ -962,7 +965,11 @@ pre_fn(DECL_ARGS)
outflags &= ~MMAN_spc;
print_word("(");
outflags &= ~MMAN_spc;
- return(pre_fa(m, n->next));
+
+ n = n->next;
+ if (NULL != n)
+ pre_fa(m, n);
+ return(0);
}
static void
@@ -1092,7 +1099,7 @@ pre_it(DECL_ARGS)
case (LIST_dash):
/* FALLTHROUGH */
case (LIST_hyphen):
- print_width(bln->norm->Bl.width, NULL);
+ print_width(bln->norm->Bl.width, NULL, 0);
outflags |= MMAN_nl;
font_push('B');
if (LIST_bullet == bln->norm->Bl.type)
@@ -1102,15 +1109,15 @@ pre_it(DECL_ARGS)
font_pop();
break;
case (LIST_enum):
- print_width(bln->norm->Bl.width, NULL);
+ print_width(bln->norm->Bl.width, NULL, 0);
outflags |= MMAN_nl;
print_count(&bln->norm->Bl.count);
break;
case (LIST_hang):
- print_width(bln->norm->Bl.width, n->child);
+ print_width(bln->norm->Bl.width, n->child, 6);
break;
case (LIST_tag):
- print_width(bln->norm->Bl.width, NULL);
+ print_width(bln->norm->Bl.width, NULL, 8);
break;
default:
return(1);