From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]); by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id f69b5c8c; for ; Wed, 24 Dec 2014 13:04:40 -0500 (EST) Date: Wed, 24 Dec 2014 13:04:40 -0500 (EST) Message-Id: <13002344968762858951.enqueue@fantadrom.bsd.lv> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: For .RS, we need to save the information how much we actually X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- For .RS, we need to save the information how much we actually indented because negative indents can get truncated, in which case we no longer know how to restore the original indent at the end of the block. This also solves another case of effectively infinite output found by jsg@ with afl, triggered by very large negative indents. Modified Files: -------------- mdocml: man.h man_term.c Revision Data ------------- Index: man.h =================================================================== RCS file: /home/cvs/mdocml/mdocml/man.h,v retrieving revision 1.67 retrieving revision 1.68 diff -Lman.h -Lman.h -u -p -r1.67 -r1.68 --- man.h +++ man.h @@ -99,6 +99,7 @@ struct man_node { struct man_node *body; /* BLOCK node BODY ptr */ const struct tbl_span *span; /* TBL */ const struct eqn *eqn; /* EQN */ + int aux; /* decoded node data, type-dependent */ }; /* Names of macros. Index is enum mant. */ Index: man_term.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/man_term.c,v retrieving revision 1.164 retrieving revision 1.165 diff -Lman_term.c -Lman_term.c -u -p -r1.164 -r1.165 --- man_term.c +++ man_term.c @@ -47,7 +47,7 @@ struct mtermp { #define DECL_ARGS struct termp *p, \ struct mtermp *mt, \ - const struct man_node *n, \ + struct man_node *n, \ const struct man_meta *meta struct termact { @@ -280,7 +280,7 @@ static int pre_alternate(DECL_ARGS) { enum termfont font[2]; - const struct man_node *nn; + struct man_node *nn; int savelit, i; switch (n->tok) { @@ -643,7 +643,7 @@ static int pre_TP(DECL_ARGS) { struct roffsu su; - const struct man_node *nn; + struct man_node *nn; int len, savelit; switch (n->type) { @@ -840,7 +840,6 @@ static int pre_RS(DECL_ARGS) { struct roffsu su; - int len; switch (n->type) { case MAN_BLOCK: @@ -852,17 +851,16 @@ pre_RS(DECL_ARGS) break; } - len = SHRT_MAX + 1; - if ((n = n->parent->head->child) != NULL && - a2roffsu(n->string, &su, SCALE_EN)) - len = term_hspan(p, &su); - if (len > SHRT_MAX) - len = term_len(p, p->defindent); + n = n->parent->head; + n->aux = SHRT_MAX + 1; + if (n->child != NULL && a2roffsu(n->child->string, &su, SCALE_EN)) + n->aux = term_hspan(p, &su); + if (n->aux < 0 && (size_t)(-n->aux) > mt->offset) + n->aux = -mt->offset; + else if (n->aux > SHRT_MAX) + n->aux = term_len(p, p->defindent); - if (len > 0 || (size_t)(-len) < mt->offset) - mt->offset += len; - else - mt->offset = 0; + mt->offset += n->aux; p->offset = mt->offset; p->rmargin = p->maxrmargin; @@ -876,8 +874,6 @@ pre_RS(DECL_ARGS) static void post_RS(DECL_ARGS) { - struct roffsu su; - int len; switch (n->type) { case MAN_BLOCK: @@ -889,17 +885,7 @@ post_RS(DECL_ARGS) break; } - len = SHRT_MAX + 1; - if ((n = n->parent->head->child) != NULL && - a2roffsu(n->string, &su, SCALE_EN)) - len = term_hspan(p, &su); - if (len > SHRT_MAX) - len = term_len(p, p->defindent); - - if (len < 0 || (size_t)len < mt->offset) - mt->offset -= len; - else - mt->offset = 0; + mt->offset -= n->parent->head->aux; p->offset = mt->offset; if (--mt->lmarginsz < MAXMARGINS) -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv