From: Nicholas Clark Date: Fri, 28 Dec 2007 22:01:30 +0000 (+0000) Subject: Silly Nick. There was a bug in change 30757 whereby the precomp of a X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=3a9b2cacfb08e1181b7d9ae45cad1ed8acd59972;p=p5sagit%2Fp5-mst-13.2.git Silly Nick. There was a bug in change 30757 whereby the precomp of a dup'd regexp would be pointing somewhere la-la. Probably at the precomp of the same regexp in the parent thread. (So it is only likely to go nasal daemon if the parent thread terminates first, or explicitly goes around freeing up run time generated regexps.) p4raw-id: //depot/perl@32754 --- diff --git a/regcomp.c b/regcomp.c index 9732086..544bbbc 100644 --- a/regcomp.c +++ b/regcomp.c @@ -9371,6 +9371,7 @@ Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param) dVAR; regexp *ret; I32 npar; + U32 precomp_offset; if (!r) return (REGEXP *)NULL; @@ -9419,8 +9420,10 @@ Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param) } } + precomp_offset = RX_PRECOMP(ret) - ret->wrapped; + ret->wrapped = SAVEPVN(ret->wrapped, ret->wraplen+1); - RX_PRECOMP(ret) = ret->wrapped + (RX_PRECOMP(ret) - ret->wrapped); + RX_PRECOMP(ret) = ret->wrapped + precomp_offset; ret->paren_names = hv_dup_inc(ret->paren_names, param); if (ret->pprivate)