summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-12-04 00:44:12 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-12-04 00:44:12 +0000
commit104a65153587e466515ddab8bd99fccb419f651c (patch)
treea22de01e1885c82fe14a74a4ed7ce747b2d4c6b9
parent1e7720d904665f833840ea9ab53b3879b399fcc4 (diff)
downloadmandoc-104a65153587e466515ddab8bd99fccb419f651c.tar.gz
Jumping out of man_unscope() for the root node is a bad idea
because that will skip root node validation, potentially entering rendering modules will NULL pointers lurking in the meta data. Instead, always validate the root node and (as suggested by joerg@) assert validity of the meta data before using it in the renderers. ok joerg@
-rw-r--r--man_html.c11
-rw-r--r--man_macro.c2
-rw-r--r--man_term.c15
3 files changed, 16 insertions, 12 deletions
diff --git a/man_html.c b/man_html.c
index 49f373c0..7adea05e 100644
--- a/man_html.c
+++ b/man_html.c
@@ -178,6 +178,8 @@ print_man_head(MAN_ARGS)
{
print_gen_head(h);
+ assert(m->title);
+ assert(m->msec);
bufcat_fmt(h, "%s(%s)", m->title, m->msec);
print_otag(h, TAG_TITLE, 0, NULL);
print_text(h, h->buf);
@@ -305,8 +307,9 @@ man_root_pre(MAN_ARGS)
if (m->vol)
(void)strlcat(b, m->vol, BUFSIZ);
- snprintf(title, BUFSIZ - 1, "%s(%s)", m->title ? m->title : "",
- m->msec ? m->msec : "");
+ assert(m->title);
+ assert(m->msec);
+ snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec);
PAIR_SUMMARY_INIT(&tag[0], "Document Header");
PAIR_CLASS_INIT(&tag[1], "head");
@@ -360,8 +363,8 @@ man_root_post(MAN_ARGS)
PAIR_CLASS_INIT(&tag[0], "foot-date");
print_otag(h, TAG_TD, 1, tag);
- if (m->date)
- print_text(h, m->date);
+ assert(m->date);
+ print_text(h, m->date);
print_stagq(h, tt);
PAIR_CLASS_INIT(&tag[0], "foot-os");
diff --git a/man_macro.c b/man_macro.c
index 42d42279..50dd477d 100644
--- a/man_macro.c
+++ b/man_macro.c
@@ -120,8 +120,6 @@ man_unscope(struct man *m, const struct man_node *to,
assert(to);
- if (MAN_ROOT == m->last->type)
- return(1);
m->next = MAN_NEXT_SIBLING;
/* LINTED */
diff --git a/man_term.c b/man_term.c
index caef1e00..4b3473a8 100644
--- a/man_term.c
+++ b/man_term.c
@@ -963,15 +963,17 @@ print_man_foot(struct termp *p, const void *arg)
const struct man_meta *meta;
meta = (const struct man_meta *)arg;
+ assert(meta->title);
+ assert(meta->msec);
+ assert(meta->date);
term_fontrepl(p, TERMFONT_NONE);
term_vspace(p);
term_vspace(p);
term_vspace(p);
- snprintf(title, BUFSIZ, "%s(%s)", meta->title ? meta->title : "",
- meta->msec ? meta->msec : "");
- datelen = term_strlen(p, meta->date ? meta->date : "");
+ snprintf(title, BUFSIZ, "%s(%s)", meta->title, meta->msec);
+ datelen = term_strlen(p, meta->date);
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
p->offset = 0;
@@ -987,7 +989,7 @@ print_man_foot(struct termp *p, const void *arg)
if (p->offset + datelen >= p->rmargin)
p->rmargin = p->offset + datelen;
- term_word(p, meta->date ? meta->date : "");
+ term_word(p, meta->date);
term_flushln(p);
p->flags &= ~TERMP_NOBREAK;
@@ -1008,6 +1010,8 @@ print_man_head(struct termp *p, const void *arg)
const struct man_meta *m;
m = (const struct man_meta *)arg;
+ assert(m->title);
+ assert(m->msec);
/*
* Note that old groff would spit out some spaces before the
@@ -1024,8 +1028,7 @@ print_man_head(struct termp *p, const void *arg)
strlcpy(buf, m->vol, BUFSIZ);
buflen = term_strlen(p, buf);
- snprintf(title, BUFSIZ, "%s(%s)", m->title ? m->title : "",
- m->msec ? m->msec : "");
+ snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
titlen = term_strlen(p, title);
p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;