regcomp.c: Don’t point mother_re to regexp copy
authorFather Chrysostomos <sprout@cpan.org>
Mon, 29 Oct 2012 06:37:21 +0000 (23:37 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 30 Oct 2012 19:35:55 +0000 (12:35 -0700)
commitcee586a5b97b5aa6ef1a9483939c30c643d63332
tree4aa0fefdd6659f2f796195ad06d0499cbfe8aa74
parentedd9fea2b8b49b8bfc982ef54ba4182316112678
regcomp.c: Don’t point mother_re to regexp copy

In code like this:

    $x = ${qr//};
    $y = $x
    undef $x;

We end up with $y’s mother_re pointer pointing to something that is
not a regexp.

This can cause thread cloning to create a new regexp with its SvPVX
pointing to the string buffer of the original regexp:

    $x = ${qr/abcd/};
    $y = $x;
    use Devel::Peek;
    Dump($y);
    $x = *3;
    use threads;
    async { Dump $y; print $y, "\n" }->join;

The dump shows that both $y’s share the same string buffer, and nei-
ther claims ownership to it.

I have not been able to make this crash or reuse the string for some-
thing else, but still this is walking a fine line.  Theoretically, it
should be possible for that string to be freed and reused in the par-
ent thread while the child thread is still using it.

Instead of pointing mother_re to the rhs of the assignment, point it
to the original re from which the rhs derives its existence.  I.e.,
copy the mother_re field.
regcomp.c