This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
rework perl #129903 - inf recursion from use of empty pattern in regex codeblock
authorYves Orton <demerphq@gmail.com>
Mon, 31 Oct 2016 19:22:37 +0000 (20:22 +0100)
committerYves Orton <demerphq@gmail.com>
Tue, 1 Nov 2016 12:29:48 +0000 (13:29 +0100)
commit5585e758ec847fcd75936b77096edf5234d6e0c0
tree1067e5d69b4a4ffc029abad8b9afce586b5aa91e
parent27deb0cf05ad74bec9ea0da3d1b6405346a66401
rework perl #129903 - inf recursion from use of empty pattern in regex codeblock

FC didn't like my previous patch for this issue, so here is the
one he likes better. With tests and etc. :-)

The basic problem is that code like this: /(?{ s!!! })/ can trigger
infinite recursion on the C stack (not the normal perl stack) when the
last successful pattern in scope is itself. Since the C stack overflows
this manifests as an untrappable error/segfault, which then kills perl.

We avoid the segfault by simply forbidding the use of the empty pattern
when it would resolve to the currently executing pattern.

I imagine with a bit of effort someone can trigger the original SEGV,
unlike my original fix which forbade use of the empty pattern in a
regex code block. So if someone actually reports such a bug we might
have to revert to the older approach of prohibiting this.
embedvar.h
intrpvar.h
pod/perldiag.pod
pp_ctl.c
pp_hot.c
regexec.c
t/re/pat.t