diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-03-31 08:04:57 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-03-31 08:04:57 +0000 |
commit | 7b210745c51f43a010960ae23f8c998c8d1dce86 (patch) | |
tree | 0a918aba8d241ba3be010631530f4b10a78b303e /mdoc_macro.c | |
parent | a12f0f0bcfd4c67c0c4b89f7e99eebe364ac9b92 (diff) | |
download | mandoc-7b210745c51f43a010960ae23f8c998c8d1dce86.tar.gz |
Fixed fatal bug in Xo/Xc patch that caused segfaults with last-child explicit-scope macros.
Diffstat (limited to 'mdoc_macro.c')
-rw-r--r-- | mdoc_macro.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c index 5c8081ec..1076d855 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -879,6 +879,7 @@ blk_full(MACRO_PROT_ARGS) int c, la; struct mdoc_arg *arg; struct mdoc_node *head; /* save of head macro */ + struct mdoc_node *body; /* save of body macro */ #ifdef UGLY struct mdoc_node *n; #endif @@ -923,7 +924,7 @@ blk_full(MACRO_PROT_ARGS) if ( ! mdoc_block_alloc(m, line, ppos, tok, arg)) return(0); - head = NULL; + head = body = NULL; /* * The `Nd' macro has all arguments in its body: it's a hybrid @@ -938,6 +939,7 @@ blk_full(MACRO_PROT_ARGS) return(0); if ( ! mdoc_body_alloc(m, line, ppos, tok)) return(0); + body = m->last; } for (;;) { @@ -994,20 +996,23 @@ blk_full(MACRO_PROT_ARGS) if (1 == ppos && ! append_delims(m, line, pos, buf)) return(0); - /* See notes on `Nd' hybrid, above. */ + /* If we've already opened our body, exit now. */ - if (MDOC_Nd == tok) + if (NULL != body) return(1); #ifdef UGLY /* - * If there is an open sub-block requiring explicit close-out, - * postpone switching the current block from head to body until - * the rew_sub() call closing out that sub-block. + * If there is an open (i.e., unvalidated) sub-block requiring + * explicit close-out, postpone switching the current block from + * head to body until the rew_sub() call closing out that + * sub-block. */ for (n = m->last; n && n != head; n = n->parent) { - if (MDOC_EXPLICIT & mdoc_macros[n->tok].flags && - MDOC_BLOCK == n->type) { + if (MDOC_BLOCK == n->type && + MDOC_EXPLICIT & mdoc_macros[n->tok].flags && + ! (MDOC_VALID & n->flags)) { + assert( ! (MDOC_ACTED & n->flags)); n->pending = head; return(1); } |