diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2017-01-08 00:11:23 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2017-01-08 00:11:23 +0000 |
commit | 4a5cf76e05bfa8c6f11863146fd01fe30a12eb82 (patch) | |
tree | 2358c0fe3d8e389cee811b9a5dc43d3a9d031c12 /mdoc_validate.c | |
parent | 510bf831302fd1a0fb51877b2eea20c58b2e7255 (diff) | |
download | mandoc-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.c | 30 |
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) |