aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mdoc_validate.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2012-07-12 15:11:14 +0000
committerIngo Schwarze <schwarze@openbsd.org>2012-07-12 15:11:14 +0000
commita19c95fa6a0579b54387165ee1396f52a4f586df (patch)
treefe4387c9b2dd40fe521806867f53388a88512b1b /mdoc_validate.c
parent5b96439af7b14f4fc13c1aa3249974a9ad9ddfd4 (diff)
downloadmandoc-a19c95fa6a0579b54387165ee1396f52a4f586df.tar.gz
mandoc-a19c95fa6a0579b54387165ee1396f52a4f586df.tar.zst
mandoc-a19c95fa6a0579b54387165ee1396f52a4f586df.zip
The post_nm() validation function crashed when the first .Nm child node
was a non-text node. Fix this by rewriting post_nm() to always set the meta name to UNKNOWN when the name is missing or unusable. While here, make MANDOCERR_NONAME an ERROR, as it usually renders the page content unintelligible. Bug reported by Maxim <Belooussov at gmail dot com>, thanks. OpenBSD rev. 1.105
Diffstat (limited to 'mdoc_validate.c')
-rw-r--r--mdoc_validate.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/mdoc_validate.c b/mdoc_validate.c
index eb7af226..c4c626ff 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.186 2012/07/11 16:57:43 schwarze Exp $ */
+/* $Id: mdoc_validate.c,v 1.187 2012/07/12 15:11:14 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
@@ -1123,24 +1123,29 @@ post_nm(POST_ARGS)
char buf[BUFSIZ];
int c;
- /* If no child specified, make sure we have the meta name. */
-
- if (NULL == mdoc->last->child && NULL == mdoc->meta.name) {
- mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME);
- return(1);
- } else if (mdoc->meta.name)
+ if (NULL != mdoc->meta.name)
return(1);
- /* If no meta name, set it from the child. */
+ /* Try to use our children for setting the meta name. */
- buf[0] = '\0';
- if (-1 == (c = concat(buf, mdoc->last->child, BUFSIZ))) {
+ if (NULL != mdoc->last->child) {
+ buf[0] = '\0';
+ c = concat(buf, mdoc->last->child, BUFSIZ);
+ } else
+ c = 0;
+
+ switch (c) {
+ case (-1):
mdoc_nmsg(mdoc, mdoc->last->child, MANDOCERR_MEM);
return(0);
+ case (0):
+ mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME);
+ mdoc->meta.name = mandoc_strdup("UNKNOWN");
+ break;
+ default:
+ mdoc->meta.name = mandoc_strdup(buf);
+ break;
}
-
- assert(c);
- mdoc->meta.name = mandoc_strdup(buf);
return(1);
}