aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mdoc_validate.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-01-08 00:11:23 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-01-08 00:11:23 +0000
commit4a5cf76e05bfa8c6f11863146fd01fe30a12eb82 (patch)
tree2358c0fe3d8e389cee811b9a5dc43d3a9d031c12 /mdoc_validate.c
parent510bf831302fd1a0fb51877b2eea20c58b2e7255 (diff)
downloadmandoc-4a5cf76e05bfa8c6f11863146fd01fe30a12eb82.tar.gz
mandoc-4a5cf76e05bfa8c6f11863146fd01fe30a12eb82.tar.zst
mandoc-4a5cf76e05bfa8c6f11863146fd01fe30a12eb82.zip
Stricter validation of the NAME section, in particular:
- require a comma between names - reject all other text nodes - reject all empty Nm below NAME, not only in the leading position - reject Nm after Nd
Diffstat (limited to 'mdoc_validate.c')
-rw-r--r--mdoc_validate.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/mdoc_validate.c b/mdoc_validate.c
index 504acd87..89969d63 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1,7 +1,7 @@
-/* $Id: mdoc_validate.c,v 1.310 2016/12/28 17:34:18 schwarze Exp $ */
+/* $Id: mdoc_validate.c,v 1.311 2017/01/08 00:11:24 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2016 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -851,12 +851,11 @@ post_nm(POST_ARGS)
n->last->tok == MDOC_Lp))
mdoc_node_relink(mdoc, n->last);
- if (mdoc->meta.name != NULL)
- return;
-
- deroff(&mdoc->meta.name, n);
-
if (mdoc->meta.name == NULL)
+ deroff(&mdoc->meta.name, n);
+
+ if (mdoc->meta.name == NULL ||
+ (mdoc->lastsec == SEC_NAME && n->child == NULL))
mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse,
n->line, n->pos, "Nm");
}
@@ -1598,8 +1597,12 @@ post_sh_name(POST_ARGS)
for (n = mdoc->last->child; n != NULL; n = n->next) {
switch (n->tok) {
case MDOC_Nm:
+ if (hasnm && n->child != NULL)
+ mandoc_vmsg(MANDOCERR_NAMESEC_PUNCT,
+ mdoc->parse, n->line, n->pos,
+ "Nm %s", n->child->string);
hasnm = 1;
- break;
+ continue;
case MDOC_Nd:
hasnd = 1;
if (n->next != NULL)
@@ -1607,14 +1610,19 @@ post_sh_name(POST_ARGS)
mdoc->parse, n->line, n->pos, NULL);
break;
case TOKEN_NONE:
- if (hasnm)
- break;
+ if (n->type == ROFFT_TEXT &&
+ n->string[0] == ',' && n->string[1] == '\0' &&
+ n->next != NULL && n->next->tok == MDOC_Nm) {
+ n = n->next;
+ continue;
+ }
/* FALLTHROUGH */
default:
mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse,
n->line, n->pos, mdoc_macronames[n->tok]);
- break;
+ continue;
}
+ break;
}
if ( ! hasnm)