diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2011-12-04 00:44:12 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2011-12-04 00:44:12 +0000 |
commit | 104a65153587e466515ddab8bd99fccb419f651c (patch) | |
tree | a22de01e1885c82fe14a74a4ed7ce747b2d4c6b9 | |
parent | 1e7720d904665f833840ea9ab53b3879b399fcc4 (diff) | |
download | mandoc-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.c | 11 | ||||
-rw-r--r-- | man_macro.c | 2 | ||||
-rw-r--r-- | man_term.c | 15 |
3 files changed, 16 insertions, 12 deletions
@@ -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 */ @@ -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; |