[perl #126182] rework pattern GOSUB infinite recursion detection
authorYves Orton <demerphq@gmail.com>
Sun, 13 Mar 2016 10:15:30 +0000 (11:15 +0100)
committerYves Orton <demerphq@gmail.com>
Sun, 13 Mar 2016 11:39:56 +0000 (12:39 +0100)
commit401a80220e9b38609f41611345e25c9956fd7157
tree6045f2f48aba0be20e59d5dc96c0ee2c3f5c3541
parentcb41e5d6f2193df9fd06cf60a96285694ec458ba
[perl #126182] rework pattern GOSUB infinite recursion detection

In ba6840fbf2fdde3e7f1bda1a26f46c901f36d5ec I tried to fix
[perl #126182] which is a bug about us failing to detect regex
left recursion in some cases.

There were two problems with that patch, both pointed out by
Zefram. The first is that I made left recursion a match fail,
instead of throwing an exception, this makes left-recursion match
sometimes, but at least sometimes in what is arguably the wrong
way. Zefram was able to convince me that dying is better than
matching incorrectly.

The second patch was that it ignored some subtleties in how
the backtracking stack works, which affected how the patch
restored the recurse_locinput[] data which is used to track
what position a GOSUB was entered from. This meant that in
various cases it would not be restored correctly, and we would
still infinite recurse. I believe that it works correctly now.

Thanks for Zefram for the feedback on the original patch.
regexec.c
t/re/pat.t