summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/mandoc/Makefile4
-rw-r--r--usr.bin/mandoc/man.37
-rw-r--r--usr.bin/mandoc/man.c7
-rw-r--r--usr.bin/mandoc/man_term.c6
-rw-r--r--usr.bin/mandoc/man_validate.c114
-rw-r--r--usr.bin/mandoc/mandoc.h4
-rw-r--r--usr.bin/mandoc/mdoc_validate.c6
-rw-r--r--usr.bin/mandoc/roff.c36
8 files changed, 98 insertions, 86 deletions
diff --git a/usr.bin/mandoc/Makefile b/usr.bin/mandoc/Makefile
index b658d892f17..d94e5bbf594 100644
--- a/usr.bin/mandoc/Makefile
+++ b/usr.bin/mandoc/Makefile
@@ -1,8 +1,8 @@
-# $OpenBSD: Makefile,v 1.48 2010/12/01 23:02:57 schwarze Exp $
+# $OpenBSD: Makefile,v 1.49 2010/12/07 00:08:52 schwarze Exp $
.include <bsd.own.mk>
-VERSION=1.10.6
+VERSION=1.10.7
CFLAGS+=-DVERSION=\"${VERSION}\"
CFLAGS+=-W -Wall -Wstrict-prototypes
diff --git a/usr.bin/mandoc/man.3 b/usr.bin/mandoc/man.3
index 39732684dd7..39435c2a8c3 100644
--- a/usr.bin/mandoc/man.3
+++ b/usr.bin/mandoc/man.3
@@ -1,4 +1,4 @@
-.\" $Id: man.3,v 1.17 2010/11/29 02:26:45 schwarze Exp $
+.\" $Id: man.3,v 1.18 2010/12/07 00:08:52 schwarze Exp $
.\"
.\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv>
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: November 29 2010 $
+.Dd $Mdocdate: December 7 2010 $
.Dt MAN 3
.Os
.Sh NAME
@@ -85,7 +85,8 @@ library also accepts the following macro:
.Pp
.Bl -tag -width Ds -compact
.It PD
-Has no effect. Handled as a current-scope line macro.
+Has no effect.
+Handled as a current-scope line macro.
.El
.Ss Types
.Bl -ohang
diff --git a/usr.bin/mandoc/man.c b/usr.bin/mandoc/man.c
index 8778aea1408..8b2621facd8 100644
--- a/usr.bin/mandoc/man.c
+++ b/usr.bin/mandoc/man.c
@@ -1,4 +1,4 @@
-/* $Id: man.c,v 1.48 2010/12/01 23:02:59 schwarze Exp $ */
+/* $Id: man.c,v 1.49 2010/12/07 00:08:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -517,12 +517,13 @@ man_pmacro(struct man *m, int ln, char *buf, int offs)
n = m->last;
assert(MAN_TEXT != n->type);
- /* .B .br .br .B: remove prior including children */
+ /* Remove repeated NSCOPED macros causing ELINE. */
+
if (MAN_NSCOPED & man_macros[n->tok].flags)
n = n->parent;
man_vmsg(m, MANDOCERR_LINESCOPE, n->line, n->pos,
- "%s", man_macronames[n->tok]);
+ "%s", man_macronames[n->tok]);
man_node_delete(m, n);
m->flags &= ~MAN_ELINE;
diff --git a/usr.bin/mandoc/man_term.c b/usr.bin/mandoc/man_term.c
index 1a4280fc81b..ddd9bfbb147 100644
--- a/usr.bin/mandoc/man_term.c
+++ b/usr.bin/mandoc/man_term.c
@@ -1,4 +1,4 @@
-/* $Id: man_term.c,v 1.54 2010/12/06 22:43:54 schwarze Exp $ */
+/* $Id: man_term.c,v 1.55 2010/12/07 00:08:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -260,7 +260,6 @@ pre_literal(DECL_ARGS)
return(1);
}
-
/* ARGSUSED */
static int
pre_alternate(DECL_ARGS)
@@ -313,7 +312,6 @@ pre_alternate(DECL_ARGS)
return(0);
}
-
/* ARGSUSED */
static int
pre_B(DECL_ARGS)
@@ -323,7 +321,6 @@ pre_B(DECL_ARGS)
return(1);
}
-
/* ARGSUSED */
static int
pre_ft(DECL_ARGS)
@@ -365,7 +362,6 @@ pre_ft(DECL_ARGS)
return(0);
}
-
/* ARGSUSED */
static int
pre_in(DECL_ARGS)
diff --git a/usr.bin/mandoc/man_validate.c b/usr.bin/mandoc/man_validate.c
index 179d7ede5d6..43820d75b19 100644
--- a/usr.bin/mandoc/man_validate.c
+++ b/usr.bin/mandoc/man_validate.c
@@ -1,4 +1,4 @@
-/* $Id: man_validate.c,v 1.35 2010/12/06 23:03:56 schwarze Exp $ */
+/* $Id: man_validate.c,v 1.36 2010/12/07 00:08:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -24,6 +24,7 @@
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include "mandoc.h"
#include "libman.h"
@@ -44,10 +45,10 @@ struct man_valid {
static int check_bline(CHKARGS);
static int check_eq0(CHKARGS);
+static int check_ft(CHKARGS);
static int check_le1(CHKARGS);
static int check_ge2(CHKARGS);
static int check_le5(CHKARGS);
-static int check_ft(CHKARGS);
static int check_par(CHKARGS);
static int check_part(CHKARGS);
static int check_root(CHKARGS);
@@ -66,8 +67,8 @@ static v_check posts_at[] = { post_AT, NULL };
static v_check posts_eq0[] = { check_eq0, NULL };
static v_check posts_fi[] = { check_eq0, post_fi, NULL };
static v_check posts_le1[] = { check_le1, NULL };
-static v_check posts_nf[] = { check_eq0, post_nf, NULL };
static v_check posts_ft[] = { check_ft, NULL };
+static v_check posts_nf[] = { check_eq0, post_nf, NULL };
static v_check posts_par[] = { check_par, NULL };
static v_check posts_part[] = { check_part, NULL };
static v_check posts_sec[] = { check_sec, NULL };
@@ -275,7 +276,6 @@ INEQ_DEFINE(1, <=, le1)
INEQ_DEFINE(2, >=, ge2)
INEQ_DEFINE(5, <=, le5)
-
static int
check_ft(CHKARGS)
{
@@ -317,18 +317,18 @@ check_ft(CHKARGS)
}
if (0 == ok) {
- man_vmsg(m, MANDOCERR_BADFONT, n->line, n->pos, "%s", cp);
+ man_vmsg(m, MANDOCERR_BADFONT,
+ n->line, n->pos, "%s", cp);
*cp = '\0';
}
if (1 < n->nchild)
man_vmsg(m, MANDOCERR_ARGCOUNT, n->line, n->pos,
- "want one child (have %d)", n->nchild);
+ "want one child (have %d)", n->nchild);
return(1);
}
-
static int
check_sec(CHKARGS)
{
@@ -353,6 +353,56 @@ check_part(CHKARGS)
return(1);
}
+
+static int
+check_par(CHKARGS)
+{
+
+ if (MAN_BODY == n->type)
+ switch (n->tok) {
+ case (MAN_IP):
+ /* FALLTHROUGH */
+ case (MAN_HP):
+ /* FALLTHROUGH */
+ case (MAN_TP):
+ /* Body-less lists are ok. */
+ break;
+ default:
+ if (0 == n->nchild)
+ man_nmsg(m, n, MANDOCERR_NOBODY);
+ break;
+ }
+ if (MAN_HEAD == n->type)
+ switch (n->tok) {
+ case (MAN_PP):
+ /* FALLTHROUGH */
+ case (MAN_P):
+ /* FALLTHROUGH */
+ case (MAN_LP):
+ if (n->nchild)
+ man_nmsg(m, n, MANDOCERR_ARGSLOST);
+ break;
+ default:
+ break;
+ }
+
+ return(1);
+}
+
+
+static int
+check_bline(CHKARGS)
+{
+
+ assert( ! (MAN_ELINE & m->flags));
+ if (MAN_BLINE & m->flags) {
+ man_nmsg(m, n, MANDOCERR_SYNTLINESCOPE);
+ return(0);
+ }
+
+ return(1);
+}
+
static int
post_TH(CHKARGS)
{
@@ -534,53 +584,3 @@ post_TS(CHKARGS)
return(1);
}
-
-static int
-check_par(CHKARGS)
-{
-
- if (MAN_BODY == n->type)
- switch (n->tok) {
- case (MAN_IP):
- /* FALLTHROUGH */
- case (MAN_HP):
- /* FALLTHROUGH */
- case (MAN_TP):
- /* Body-less lists are ok. */
- break;
- default:
- if (0 == n->nchild)
- man_nmsg(m, n, MANDOCERR_NOBODY);
- break;
- }
- if (MAN_HEAD == n->type)
- switch (n->tok) {
- case (MAN_PP):
- /* FALLTHROUGH */
- case (MAN_P):
- /* FALLTHROUGH */
- case (MAN_LP):
- if (n->nchild)
- man_nmsg(m, n, MANDOCERR_ARGSLOST);
- break;
- default:
- break;
- }
-
- return(1);
-}
-
-
-static int
-check_bline(CHKARGS)
-{
-
- assert( ! (MAN_ELINE & m->flags));
- if (MAN_BLINE & m->flags) {
- man_nmsg(m, n, MANDOCERR_SYNTLINESCOPE);
- return(0);
- }
-
- return(1);
-}
-
diff --git a/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h
index aa7a04de05e..b6ce8685677 100644
--- a/usr.bin/mandoc/mandoc.h
+++ b/usr.bin/mandoc/mandoc.h
@@ -1,4 +1,4 @@
-/* $Id: mandoc.h,v 1.23 2010/12/01 22:02:29 schwarze Exp $ */
+/* $Id: mandoc.h,v 1.24 2010/12/07 00:08:52 schwarze Exp $ */
/*
* Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -100,6 +100,7 @@ enum mandocerr {
MANDOCERR_BADQUOTE, /* unterminated quoted string */
MANDOCERR_ERROR, /* ===== start of errors ===== */
+
MANDOCERR_BADCHAR, /* skipping bad character */
MANDOCERR_NOTEXT, /* skipping text before the first section header */
MANDOCERR_MACRO, /* skipping unknown macro */
@@ -120,6 +121,7 @@ enum mandocerr {
MANDOCERR_TBL, /* tbl(1) error */
MANDOCERR_FATAL, /* ===== start of fatal errors ===== */
+
MANDOCERR_COLUMNS, /* column syntax is inconsistent */
MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */
MANDOCERR_SYNTLINESCOPE, /* line scope broken, syntax violated */
diff --git a/usr.bin/mandoc/mdoc_validate.c b/usr.bin/mandoc/mdoc_validate.c
index 6c412b47793..3a5f22e5754 100644
--- a/usr.bin/mandoc/mdoc_validate.c
+++ b/usr.bin/mandoc/mdoc_validate.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.76 2010/12/01 22:02:29 schwarze Exp $ */
+/* $Id: mdoc_validate.c,v 1.77 2010/12/07 00:08:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -2121,7 +2121,8 @@ post_os(POST_ARGS)
* of filling in "sysname release" from uname().
*/
- free(mdoc->meta.os);
+ if (mdoc->meta.os)
+ free(mdoc->meta.os);
if ( ! concat(mdoc, buf, n->child, BUFSIZ))
return(0);
@@ -2191,7 +2192,6 @@ post_std(POST_ARGS)
return(1);
}
-
static int
concat(struct mdoc *m, char *p, const struct mdoc_node *n, size_t sz)
{
diff --git a/usr.bin/mandoc/roff.c b/usr.bin/mandoc/roff.c
index de161836d77..87c1ce1ae79 100644
--- a/usr.bin/mandoc/roff.c
+++ b/usr.bin/mandoc/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.21 2010/11/28 19:35:33 schwarze Exp $ */
+/* $Id: roff.c,v 1.22 2010/12/07 00:08:52 schwarze Exp $ */
/*
* Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -633,6 +633,12 @@ roff_block(ROFF_ARGS)
(*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL);
return(ROFF_IGN);
}
+
+ /*
+ * Re-write `de1', since we don't really care about
+ * groff's strange compatibility mode, into `de'.
+ */
+
if (ROFF_de1 == tok)
tok = ROFF_de;
if (ROFF_de == tok)
@@ -640,8 +646,10 @@ roff_block(ROFF_ARGS)
else
(*r->msg)(MANDOCERR_REQUEST, r->data, ln, ppos,
roffs[tok].name);
+
while ((*bufp)[pos] && ' ' != (*bufp)[pos])
pos++;
+
while (' ' == (*bufp)[pos])
(*bufp)[pos++] = '\0';
}
@@ -653,14 +661,18 @@ roff_block(ROFF_ARGS)
* with the same name, if there is one. New content will be
* added from roff_block_text() in multiline mode.
*/
+
if (ROFF_de == tok)
roff_setstr(r, name, "", 0);
if ('\0' == (*bufp)[pos])
return(ROFF_IGN);
+ /* If present, process the custom end-of-line marker. */
+
sv = pos;
- while ((*bufp)[pos] && ' ' != (*bufp)[pos] &&
+ while ((*bufp)[pos] &&
+ ' ' != (*bufp)[pos] &&
'\t' != (*bufp)[pos])
pos++;
@@ -682,8 +694,7 @@ roff_block(ROFF_ARGS)
r->last->end[(int)sz] = '\0';
if ((*bufp)[pos])
- if ( ! (*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL))
- return(ROFF_ERR);
+ (*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL);
return(ROFF_IGN);
}
@@ -858,7 +869,6 @@ roff_evalcond(const char *v, int *pos)
return(ROFFRULE_DENY);
}
-
/* ARGSUSED */
static enum rofferr
roff_line_ignore(ROFF_ARGS)
@@ -867,7 +877,6 @@ roff_line_ignore(ROFF_ARGS)
return(ROFF_IGN);
}
-
/* ARGSUSED */
static enum rofferr
roff_line_error(ROFF_ARGS)
@@ -877,7 +886,6 @@ roff_line_error(ROFF_ARGS)
return(ROFF_IGN);
}
-
/* ARGSUSED */
static enum rofferr
roff_cond(ROFF_ARGS)
@@ -919,9 +927,8 @@ roff_cond(ROFF_ARGS)
*/
if ('\0' == (*bufp)[pos] && sv != pos) {
- if ((*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL))
- return(ROFF_IGN);
- return(ROFF_ERR);
+ (*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL);
+ return(ROFF_IGN);
}
roffnode_push(r, tok, NULL, ln, ppos);
@@ -1054,7 +1061,6 @@ roff_nr(ROFF_ARGS)
return(ROFF_IGN);
}
-
/* ARGSUSED */
static enum rofferr
roff_so(ROFF_ARGS)
@@ -1063,6 +1069,13 @@ roff_so(ROFF_ARGS)
(*r->msg)(MANDOCERR_SO, r->data, ln, ppos, NULL);
+ /*
+ * Handle `so'. Be EXTREMELY careful, as we shouldn't be
+ * opening anything that's not in our cwd or anything beneath
+ * it. Thus, explicitly disallow traversing up the file-system
+ * or using absolute paths.
+ */
+
name = *bufp + pos;
if ('/' == *name || strstr(name, "../") || strstr(name, "/..")) {
(*r->msg)(MANDOCERR_SOPATH, r->data, ln, pos, NULL);
@@ -1073,7 +1086,6 @@ roff_so(ROFF_ARGS)
return(ROFF_SO);
}
-
/* ARGSUSED */
static enum rofferr
roff_userdef(ROFF_ARGS)