To prevent infinite recursion while expanding eqn(7) definitions,
authorschwarze <schwarze@openbsd.org>
Wed, 13 Apr 2022 20:19:18 +0000 (20:19 +0000)
committerschwarze <schwarze@openbsd.org>
Wed, 13 Apr 2022 20:19:18 +0000 (20:19 +0000)
commit5030fd5bc503d5c97990cc21fbabbb13126c40e8
tree1357de2c3d53885f8defabae1b18006655f184aa
parentaa28260cdf92854e6e33e37687f64765b646d60a
To prevent infinite recursion while expanding eqn(7) definitions,
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.
regress/usr.bin/mandoc/eqn/define/infinite.in
regress/usr.bin/mandoc/eqn/define/infinite.out_ascii
regress/usr.bin/mandoc/eqn/define/infinite.out_lint
usr.bin/mandoc/eqn.c
usr.bin/mandoc/eqn_parse.h