aboutsummaryrefslogtreecommitdiffstatshomepage
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
commit5b96439af7b14f4fc13c1aa3249974a9ad9ddfd4 (patch)
tree2aec4d90525eb5c9a0a6e96373a4e6b0784f98df /mdoc_man.c
parent0ae5dd38980852a8fe3370aa6b65f9d1cba15c86 (diff)
downloadmandoc-5b96439af7b14f4fc13c1aa3249974a9ad9ddfd4.tar.gz
mandoc-5b96439af7b14f4fc13c1aa3249974a9ad9ddfd4.tar.zst
mandoc-5b96439af7b14f4fc13c1aa3249974a9ad9ddfd4.zip
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.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/mdoc_man.c b/mdoc_man.c
index 83ee55a6..0af2f9b3 100644
--- a/mdoc_man.c
+++ b/mdoc_man.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_man.c,v 1.34 2012/07/11 23:46:37 schwarze Exp $ */
+/* $Id: mdoc_man.c,v 1.35 2012/07/12 08:55:48 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -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);