From 3a9b2cacfb08e1181b7d9ae45cad1ed8acd59972 Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Fri, 28 Dec 2007 22:01:30 +0000 Subject: [PATCH] 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 --- regcomp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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) -- 1.8.3.1