diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2012-07-12 15:11:14 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2012-07-12 15:11:14 +0000 |
commit | a19c95fa6a0579b54387165ee1396f52a4f586df (patch) | |
tree | fe4387c9b2dd40fe521806867f53388a88512b1b /mdoc_validate.c | |
parent | 5b96439af7b14f4fc13c1aa3249974a9ad9ddfd4 (diff) | |
download | mandoc-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.c | 31 |
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); } |