]> git.cameronkatri.com Git - mandoc.git/commitdiff
To prevent infinite recursion while expanding eqn(7) definitions,
authorIngo Schwarze <schwarze@openbsd.org>
Wed, 13 Apr 2022 20:26:19 +0000 (20:26 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Wed, 13 Apr 2022 20:26:19 +0000 (20:26 +0000)
we must not reset the recursion counter when moving beyond the end
of the *previous* expansion, but we may only do so when moving
beyond the rightmost position reached by *any* expansion in the
current equation.  This matters because definitions can nest;
consider:

.EQ
define inner "content"
define outer "inner outer"
outer
.EN

This endless loop was found by tb@ using afl(1).

Incidentally, GNU eqn(1) also performs an infinite loop in this
situation and then crashes when memory runs out, but that's not an
excuse for nasty behaviour of mandoc(1).

While here, consistently print the expanded content even when the
expansion is finally truncated.  While that is not likely to help
end-users, it may help authors of eqn(7) code to understand what's
going on.  Besides, it sends a very clear signal that something is
amiss, which was easy to miss in the past unless people
enabled -W error or used -T lint.

eqn.c
eqn_parse.h
regress/eqn/define/infinite.in
regress/eqn/define/infinite.out_ascii
regress/eqn/define/infinite.out_lint

diff --git a/eqn.c b/eqn.c
index 27f5cac396cb52578a0d93b664c2c2bbda1ac251..45124c68c51d944b1fe58005d7cc24d8f6d05615 100644 (file)
--- a/eqn.c
+++ b/eqn.c
@@ -1,7 +1,8 @@
-/*     $Id: eqn.c,v 1.84 2020/01/08 12:16:24 schwarze Exp $ */
+/* $Id: eqn.c,v 1.85 2022/04/13 20:26:19 schwarze Exp $ */
 /*
+ * Copyright (c) 2014, 2015, 2017, 2018, 2020, 2022
+ *               Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014,2015,2017,2018,2020 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -375,19 +376,17 @@ eqn_def_find(struct eqn_node *ep)
 static enum eqn_tok
 eqn_next(struct eqn_node *ep, enum parse_mode mode)
 {
-       static int       last_len, lim;
-
        struct eqn_def  *def;
        size_t           start;
-       int              diff, i, quoted;
+       int              diff, i, newlen, quoted;
        enum eqn_tok     tok;
 
        /*
         * Reset the recursion counter after advancing
-        * beyond the end of the previous substitution.
+        * beyond the end of the rightmost substitution.
         */
-       if (ep->end - ep->data >= last_len)
-               lim = 0;
+       if (ep->end - ep->data >= ep->sublen)
+               ep->subcnt = 0;
 
        ep->start = ep->end;
        quoted = mode == MODE_QUOTED;
@@ -434,10 +433,10 @@ eqn_next(struct eqn_node *ep, enum parse_mode mode)
                        return EQN_TOK__MAX;
                if ((def = eqn_def_find(ep)) == NULL)
                        break;
-               if (++lim > EQN_NEST_MAX) {
+               if (++ep->subcnt > EQN_NEST_MAX) {
                        mandoc_msg(MANDOCERR_ROFFLOOP,
                            ep->node->line, ep->node->pos, NULL);
-                       return EQN_TOK_EOF;
+                       break;
                }
 
                /* Replace a defined name with its string value. */
@@ -446,12 +445,15 @@ eqn_next(struct eqn_node *ep, enum parse_mode mode)
                        ep->sz += diff;
                        ep->data = mandoc_realloc(ep->data, ep->sz + 1);
                        ep->start = ep->data + start;
+                       ep->sublen += diff;
                }
                if (diff)
                        memmove(ep->start + def->valsz, ep->start + ep->toksz,
                            strlen(ep->start + ep->toksz) + 1);
                memcpy(ep->start, def->val, def->valsz);
-               last_len = ep->start - ep->data + def->valsz;
+               newlen = ep->start - ep->data + def->valsz;
+               if (ep->sublen < newlen)
+                       ep->sublen = newlen;
        }
        if (mode != MODE_TOK)
                return quoted ? EQN_TOK_QUOTED : EQN_TOK__MAX;
@@ -678,6 +680,8 @@ eqn_parse(struct eqn_node *ep)
                return;
 
        ep->start = ep->end = ep->data;
+       ep->sublen = 0;
+       ep->subcnt = 0;
 
 next_tok:
        tok = eqn_next(ep, MODE_TOK);
index a2a4e6fd7d37d21b281be8601b0428b3a9752f24..63d7c395f8e8af377c4c7ebc8bec1ba73583395c 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: eqn_parse.h,v 1.3 2018/12/14 06:33:14 schwarze Exp $ */
+/* $Id: eqn_parse.h,v 1.4 2022/04/13 20:26:19 schwarze Exp $ */
 /*
+ * Copyright (c) 2014, 2017, 2018, 2022 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -32,6 +32,8 @@ struct        eqn_node {
        size_t            defsz;   /* Number of definitions. */
        size_t            sz;      /* Length of the source code. */
        size_t            toksz;   /* Length of the current token. */
+       int               sublen;  /* End of rightmost substitution, so far. */
+       int               subcnt;  /* Number of recursive substitutions. */
        int               gsize;   /* Default point size. */
        int               delim;   /* In-line delimiters enabled. */
        char              odelim;  /* In-line opening delimiter. */
index 420e63766b9e29309a8b2b970a7596cfc352c47f..31a3f646a759fd304b52ebd1be7b8ca84cd12e9d 100644 (file)
@@ -1,5 +1,5 @@
-.\" $OpenBSD: infinite.in,v 1.2 2017/07/04 14:53:23 schwarze Exp $
-.Dd $Mdocdate: July 4 2017 $
+.\" $OpenBSD: infinite.in,v 1.3 2022/04/13 20:19:18 schwarze Exp $
+.Dd $Mdocdate: April 13 2022 $
 .Dt DEFINE-INFINITE 1
 .Os
 .Sh NAME
@@ -29,3 +29,11 @@ trailing position:
 define key 'prefix key' key
 .EN
 eol
+.Pp
+nested expansion:
+.EQ
+define inner "content"
+define outer "inner outer"
+outer
+.EN
+eol
index 7219ce5b3363497af046c4f89c6816648fdffbbb..a756abbb70b899801bbabe9813bef59144ef1bdc 100644 (file)
@@ -4,12 +4,72 @@ N\bNA\bAM\bME\bE
      d\bde\bef\bfi\bin\bne\be-\b-i\bin\bnf\bfi\bin\bni\bit\bte\be - infinite recursion in define statements
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     alone: eol
+     alone: _\bk_\be_\beol
 
-     leading position: eol
+     leading position: _\bk_\be_\by _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx eol
 
-     middle position: eol
+     middle position: _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bk_\be_\by
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx
+     _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx _\bs_\bu_\bf_\bf_\bi_\bx eol
 
-     trailing position: eol
+     trailing position: _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx _\bp_\br_\be_\bf_\bi_\bx
+     _\bp_\br_\be_\bf_\bi_\bx _\bk_\be_\by eol
 
-OpenBSD                          July 4, 2017                          OpenBSD
+     nested expansion: _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt
+     _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bc_\bo_\bn_\bt_\be_\bn_\bt _\bo_\bu_\bt_\be_\br eol
+
+OpenBSD                         April 13, 2022                         OpenBSD
index 43089bb3be5712e740e23a25017b8cdea297ac05..245aa523fb2a127ed8463eb85293e1c657bb253c 100644 (file)
@@ -2,3 +2,4 @@ mandoc: infinite.in:10:2: ERROR: input stack limit exceeded, infinite loop?
 mandoc: infinite.in:16:2: ERROR: input stack limit exceeded, infinite loop?
 mandoc: infinite.in:22:2: ERROR: input stack limit exceeded, infinite loop?
 mandoc: infinite.in:28:2: ERROR: input stack limit exceeded, infinite loop?
+mandoc: infinite.in:34:2: ERROR: input stack limit exceeded, infinite loop?