summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-03-31 08:04:57 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-03-31 08:04:57 +0000
commit7b210745c51f43a010960ae23f8c998c8d1dce86 (patch)
tree0a918aba8d241ba3be010631530f4b10a78b303e
parenta12f0f0bcfd4c67c0c4b89f7e99eebe364ac9b92 (diff)
downloadmandoc-7b210745c51f43a010960ae23f8c998c8d1dce86.tar.gz
Fixed fatal bug in Xo/Xc patch that caused segfaults with last-child explicit-scope macros.
-rw-r--r--Makefile2
-rw-r--r--mdoc_macro.c21
2 files changed, 14 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 7561357f..73e1da83 100644
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,7 @@ INSTALL_MAN = $(INSTALL_DATA)
VERSION = 1.9.21
VDATE = 31 March 2010
-VFLAGS = -DVERSION="\"$(VERSION)\"" -DHAVE_CONFIG_H
+VFLAGS = -DVERSION="\"$(VERSION)\"" -DHAVE_CONFIG_H -DUGLY
WFLAGS = -W -Wall -Wstrict-prototypes -Wno-unused-parameter -Wwrite-strings
CFLAGS += -g $(VFLAGS) $(WFLAGS)
#CFLAGS += -DOSNAME="\"OpenBSD 4.5\""
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);
}