Fix crash with (??{undef *^R}) and (?{})
authorFather Chrysostomos <sprout@cpan.org>
Wed, 29 Jan 2014 01:50:45 +0000 (17:50 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 29 Jan 2014 01:50:59 +0000 (17:50 -0800)
commit7e68f15291c4da4e5b8237bfe9690edbd9c5a5d3
treefc099d2a064fcbb7bf2954293e6bcbe3b42f6c04
parent6e53b6cab73f4cc348a8366106f0569e65c858f1
Fix crash with (??{undef *^R}) and (?{})

$ ./perl -Ilib -e '"" =~ /(??{undef *^R;""})(?{42})/'
Segmentation fault: 11

This started crashing in 4b22688e5c.

What happens is that the undef frees the scalar pointed to by oreplsv
in regtry,  Then that scalar is reused for the regexp object created
from the return value of the ?? block.  sv_setsv(oreplsv,...) ends up
trying to set the IV slot of a regexp, overwriting the engine field
(sv_setsv probably needs an assertion).  Then later accesses crash
because r->engine is now a bad pointer.

(Though why it only started crashing in 4b22688e5c and not before I
have not figured out.)

The solution is for S_regtry to hang on to the SV with an extra refer-
ence count in case it gets freed.
regexec.c
t/re/pat.t