aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mdoc_macro.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-02-02 04:04:45 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-02-02 04:04:45 +0000
commitcaaf8f81fafbcaf6798f6a0a01404004699a25b3 (patch)
tree4e11709e936e52d985b7d7a501f89c71d885731d /mdoc_macro.c
parent457f37994fb415c2a3fb29512226644399355327 (diff)
downloadmandoc-caaf8f81fafbcaf6798f6a0a01404004699a25b3.tar.gz
mandoc-caaf8f81fafbcaf6798f6a0a01404004699a25b3.tar.zst
mandoc-caaf8f81fafbcaf6798f6a0a01404004699a25b3.zip
When a full block macro gets closed out by a mismatching
block closure macro it calls, do not attempt to open its body. This can for example happen for (nonsensical) constructions like .Fo .Nm Fc in the SYNOPSIS. Fixing an assertion failure jsg@ found with afl some time ago (test case number 731).
Diffstat (limited to 'mdoc_macro.c')
-rw-r--r--mdoc_macro.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c
index 21e01587..f46feeb0 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_macro.c,v 1.164 2015/02/01 23:56:37 schwarze Exp $ */
+/* $Id: mdoc_macro.c,v 1.165 2015/02/02 04:04:45 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1077,8 +1077,9 @@ blk_full(MACRO_PROT_ARGS)
{
int la, nl, parsed;
struct mdoc_arg *arg;
- struct mdoc_node *head; /* save of head macro */
- struct mdoc_node *body; /* save of body macro */
+ struct mdoc_node *blk; /* Our own block. */
+ struct mdoc_node *head; /* Our own head. */
+ struct mdoc_node *body; /* Our own body. */
struct mdoc_node *n;
enum margserr ac, lac;
char *p;
@@ -1118,7 +1119,7 @@ blk_full(MACRO_PROT_ARGS)
*/
mdoc_argv(mdoc, line, tok, &arg, pos, buf);
- mdoc_block_alloc(mdoc, line, ppos, tok, arg);
+ blk = mdoc_block_alloc(mdoc, line, ppos, tok, arg);
head = body = NULL;
/*
@@ -1218,6 +1219,8 @@ blk_full(MACRO_PROT_ARGS)
break;
}
+ if (blk->flags & MDOC_VALID)
+ return;
if (head == NULL)
head = mdoc_head_alloc(mdoc, line, ppos, tok);
if (nl)