Mon Jun 2 09:15:44 2008 UTC ()
Pullup ticket #2408 - requested by he
Security patch for perl

Revisions pulled up:
- lang/perl5/Makefile		1.137
- lang/perl5/distinfo		1.48
- lang/perl5/patches/patch-ad	1.11
- lang/perl5/patches/patch-af	1.13
- lang/perl5/patches/patch-ag	1.11
- lang/perl5/patches/patch-ai	1.5
- lang/perl5/patches/patch-aj	1.9
- lang/perl5/patches/patch-ak	1.3
- lang/perl5/patches/patch-da	1.2
---
    Module Name:	pkgsrc
    Committed By:	he
    Date:		Sun Jun  1 22:04:07 UTC 2008

    Modified Files:
	pkgsrc/lang/perl5: Makefile distinfo
	pkgsrc/lang/perl5/patches: patch-da
    Added Files:
	pkgsrc/lang/perl5/patches: patch-ad patch-af patch-ag patch-ai patch-aj
	    patch-ak

    Log Message:
    Apply a patch from Debian to fix the security vulnerability identified
    by http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927.

    Patch fetched from
    http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792
    which, according to comments, is from upstream change 27688.

    Revision bumped to nb8.


(tron)
diff -r1.136 -r1.136.2.1 pkgsrc/lang/perl5/Makefile
diff -r1.46.2.1 -r1.46.2.2 pkgsrc/lang/perl5/distinfo
diff -r0 -r1.10.22.1 pkgsrc/lang/perl5/patches/patch-ad
diff -r0 -r1.10.22.1 pkgsrc/lang/perl5/patches/patch-ag
diff -r0 -r1.12.22.1 pkgsrc/lang/perl5/patches/patch-af
diff -r0 -r1.4.36.1 pkgsrc/lang/perl5/patches/patch-ai
diff -r0 -r1.8.22.1 pkgsrc/lang/perl5/patches/patch-aj
diff -r0 -r1.2.36.1 pkgsrc/lang/perl5/patches/patch-ak
diff -r1.1 -r1.1.6.1 pkgsrc/lang/perl5/patches/patch-da

cvs diff -r1.136 -r1.136.2.1 pkgsrc/lang/perl5/Makefile (expand / switch to unified diff)

--- pkgsrc/lang/perl5/Makefile 2008/02/19 19:28:39 1.136
+++ pkgsrc/lang/perl5/Makefile 2008/06/02 09:15:44 1.136.2.1
@@ -1,17 +1,17 @@ @@ -1,17 +1,17 @@
1# $NetBSD: Makefile,v 1.136 2008/02/19 19:28:39 tnn Exp $ 1# $NetBSD: Makefile,v 1.136.2.1 2008/06/02 09:15:44 tron Exp $
2 2
3DISTNAME= perl-5.8.8 3DISTNAME= perl-5.8.8
4PKGREVISION= 7 4PKGREVISION= 8
5CATEGORIES= lang devel perl5 5CATEGORIES= lang devel perl5
6MASTER_SITES= ${MASTER_SITE_PERL_CPAN:S,/modules/by-module/$,/src/,} 6MASTER_SITES= ${MASTER_SITE_PERL_CPAN:S,/modules/by-module/$,/src/,}
7EXTRACT_SUFX= .tar.bz2 7EXTRACT_SUFX= .tar.bz2
8DISTFILES+= ${DISTNAME}${EXTRACT_SUFX} 8DISTFILES+= ${DISTNAME}${EXTRACT_SUFX}
9 9
10MAINTAINER= jlam@pkgsrc.org 10MAINTAINER= jlam@pkgsrc.org
11HOMEPAGE= http://www.perl.org/ 11HOMEPAGE= http://www.perl.org/
12COMMENT= Practical Extraction and Report Language 12COMMENT= Practical Extraction and Report Language
13#LICENSE= gnu-gpl-v2 13#LICENSE= gnu-gpl-v2
14 14
15PKG_DESTDIR_SUPPORT= user-destdir 15PKG_DESTDIR_SUPPORT= user-destdir
16 16
17CONFLICTS= perl-base-[0-9]* perl-thread-[0-9]* \ 17CONFLICTS= perl-base-[0-9]* perl-thread-[0-9]* \

cvs diff -r1.46.2.1 -r1.46.2.2 pkgsrc/lang/perl5/distinfo (expand / switch to unified diff)

--- pkgsrc/lang/perl5/distinfo 2008/05/30 17:13:43 1.46.2.1
+++ pkgsrc/lang/perl5/distinfo 2008/06/02 09:15:44 1.46.2.2
@@ -1,28 +1,34 @@ @@ -1,28 +1,34 @@
1$NetBSD: distinfo,v 1.46.2.1 2008/05/30 17:13:43 spz Exp $ 1$NetBSD: distinfo,v 1.46.2.2 2008/06/02 09:15:44 tron Exp $
2 2
3SHA1 (perl-5.8.8.tar.bz2) = 4aab490040727ca4419098720eca2ba4367df539 3SHA1 (perl-5.8.8.tar.bz2) = 4aab490040727ca4419098720eca2ba4367df539
4RMD160 (perl-5.8.8.tar.bz2) = e78f26d9b96e6db35f946ad4ff55e3a69385c71b 4RMD160 (perl-5.8.8.tar.bz2) = e78f26d9b96e6db35f946ad4ff55e3a69385c71b
5Size (perl-5.8.8.tar.bz2) = 10123359 bytes 5Size (perl-5.8.8.tar.bz2) = 10123359 bytes
6SHA1 (patch-aa) = 9b6844635086206dc7740103747a2b54bf987941 6SHA1 (patch-aa) = 9b6844635086206dc7740103747a2b54bf987941
7SHA1 (patch-ab) = e32427327192f023477b16f29bc55fdf4f057410 7SHA1 (patch-ab) = e32427327192f023477b16f29bc55fdf4f057410
8SHA1 (patch-ac) = 428e0757495b82a47ec092a71333fb3ec366f14f 8SHA1 (patch-ac) = 428e0757495b82a47ec092a71333fb3ec366f14f
 9SHA1 (patch-ad) = 914e1c74555a9b6a0256992a694b2ba609f29786
9SHA1 (patch-ae) = 287ac0d97a5372c8b45457129f3e70fe42cf69e2 10SHA1 (patch-ae) = 287ac0d97a5372c8b45457129f3e70fe42cf69e2
 11SHA1 (patch-af) = b11574297e46b910f206f09702effc6cc272b0fd
 12SHA1 (patch-ag) = 0122ec30b8fcd17198e068d07e95974bee0945b6
10SHA1 (patch-ah) = 25443063c26287b1b8130c53d5c9d92248d4c0d1 13SHA1 (patch-ah) = 25443063c26287b1b8130c53d5c9d92248d4c0d1
 14SHA1 (patch-ai) = 4a07c6268a1e27b73f2f6fcde86f788fce77fcbd
 15SHA1 (patch-aj) = a2fc32766ed8556455c60780fe242a034ce491a9
 16SHA1 (patch-ak) = 8899f8b6d1d038b950979073cb0527c8e7afca1e
11SHA1 (patch-am) = cf1687063d0c0542e811545aaaad291bad12d75e 17SHA1 (patch-am) = cf1687063d0c0542e811545aaaad291bad12d75e
12SHA1 (patch-an) = 987763c3098bf4356993dd6d8741962a1ff8190d 18SHA1 (patch-an) = 987763c3098bf4356993dd6d8741962a1ff8190d
13SHA1 (patch-ap) = 178d6909a8aa6544b849c2b63530fcf1893b77ea 19SHA1 (patch-ap) = 178d6909a8aa6544b849c2b63530fcf1893b77ea
14SHA1 (patch-aq) = b9569d0cd74a06912e82498cd2bfba131c0b6f3b 20SHA1 (patch-aq) = b9569d0cd74a06912e82498cd2bfba131c0b6f3b
15SHA1 (patch-ar) = 9d257ceeca337e3d477b80215560bbc290d19dd2 21SHA1 (patch-ar) = 9d257ceeca337e3d477b80215560bbc290d19dd2
16SHA1 (patch-as) = 371827db418eac11f0b49df45e9d587106908bf0 22SHA1 (patch-as) = 371827db418eac11f0b49df45e9d587106908bf0
17SHA1 (patch-ba) = 27aefd5043c251380ac607df54fff882f689f237 23SHA1 (patch-ba) = 27aefd5043c251380ac607df54fff882f689f237
18SHA1 (patch-ca) = 5ed14e043a6d5f8dadf5711b59418f01aa5f6f21 24SHA1 (patch-ca) = 5ed14e043a6d5f8dadf5711b59418f01aa5f6f21
19SHA1 (patch-cb) = 2cbcaa476f33c270bfea50cddd0da3f476dbe689 25SHA1 (patch-cb) = 2cbcaa476f33c270bfea50cddd0da3f476dbe689
20SHA1 (patch-ce) = 6b1efab32c6bc28e0faf7522322e6d805eb21730 26SHA1 (patch-ce) = 6b1efab32c6bc28e0faf7522322e6d805eb21730
21SHA1 (patch-ch) = a0831869e23d4a66588e6e27eecedb08527c9498 27SHA1 (patch-ch) = a0831869e23d4a66588e6e27eecedb08527c9498
22SHA1 (patch-ci) = fe943f07044efa457d163eb86974ea10bb356226 28SHA1 (patch-ci) = fe943f07044efa457d163eb86974ea10bb356226
23SHA1 (patch-cj) = 3f40f1b166a054d55224c3e79d74516ca608b696 29SHA1 (patch-cj) = 3f40f1b166a054d55224c3e79d74516ca608b696
24SHA1 (patch-ck) = 28207b8186c9ad194a1edc696159915bc16d1097 30SHA1 (patch-ck) = 28207b8186c9ad194a1edc696159915bc16d1097
25SHA1 (patch-cn) = b5e56787fb9ca10025e9061d7bfd2da549ee3fa3 31SHA1 (patch-cn) = b5e56787fb9ca10025e9061d7bfd2da549ee3fa3
26SHA1 (patch-da) = b25f30544dd679d95997cafb7e427a41f98884b1 32SHA1 (patch-da) = 24c8783fcdbead35de20bc3cecf1627a64717853
27SHA1 (patch-ta) = ca0d1e4bc2dbbc4b86a087fed27cd1e7bbb2873f 33SHA1 (patch-ta) = ca0d1e4bc2dbbc4b86a087fed27cd1e7bbb2873f
28SHA1 (patch-zc) = 0c61b6028813e0f80bfe0760a1e74e3037d37cdd 34SHA1 (patch-zc) = 0c61b6028813e0f80bfe0760a1e74e3037d37cdd

File Added: pkgsrc/lang/perl5/patches/Attic/patch-ad
$NetBSD: patch-ad,v 1.10.22.1 2008/06/02 09:15:44 tron Exp $

Fix for
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
from
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792

--- embed.fnc.orig	2006-01-31 15:40:27.000000000 +0100
+++ embed.fnc
@@ -1168,6 +1168,7 @@ Es	|void	|reguni		|NN const struct RExC_
 Es	|regnode*|regclass	|NN struct RExC_state_t *state
 ERs	|I32	|regcurly	|NN const char *
 Es	|regnode*|reg_node	|NN struct RExC_state_t *state|U8 op
+Es	|UV	|reg_recode	|const char value|NULLOK SV **encp
 Es	|regnode*|regpiece	|NN struct RExC_state_t *state|NN I32 *flagp
 Es	|void	|reginsert	|NN struct RExC_state_t *state|U8 op|NN regnode *opnd
 Es	|void	|regoptail	|NN struct RExC_state_t *state|NN regnode *p|NN regnode *val

File Added: pkgsrc/lang/perl5/patches/Attic/patch-ag
$NetBSD: patch-ag,v 1.10.22.1 2008/06/02 09:15:44 tron Exp $

Fix for
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
from
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792

--- pod/perldiag.pod.orig	2006-01-07 00:16:08.000000000 +0100
+++ pod/perldiag.pod
@@ -1900,6 +1900,15 @@ recognized by Perl or by a user-supplied
 (W printf) Perl does not understand the given format conversion.  See
 L<perlfunc/sprintf>.
 
+=item Invalid escape in the specified encoding in regex; marked by <-- HERE in m/%s/
+
+(W regexp) The numeric escape (for example C<\xHH>) of value < 256
+didn't correspond to a single character through the conversion
+from the encoding specified by the encoding pragma.
+The escape was replaced with REPLACEMENT CHARACTER (U+FFFD) instead.
+The <-- HERE shows in the regular expression about where the
+escape was discovered.
+
 =item Invalid [] range "%s" in regex; marked by <-- HERE in m/%s/
 
 (F) The range specified in a character class had a minimum character

File Added: pkgsrc/lang/perl5/patches/Attic/patch-af
$NetBSD: patch-af,v 1.12.22.1 2008/06/02 09:15:44 tron Exp $

Fix for
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
from
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792

--- embed.h.orig	2006-01-31 16:50:34.000000000 +0100
+++ embed.h
@@ -1234,6 +1234,7 @@
 #define regclass		S_regclass
 #define regcurly		S_regcurly
 #define reg_node		S_reg_node
+#define reg_recode		S_reg_recode
 #define regpiece		S_regpiece
 #define reginsert		S_reginsert
 #define regoptail		S_regoptail
@@ -3277,6 +3278,7 @@
 #define regclass(a)		S_regclass(aTHX_ a)
 #define regcurly(a)		S_regcurly(aTHX_ a)
 #define reg_node(a,b)		S_reg_node(aTHX_ a,b)
+#define reg_recode(a,b)		S_reg_recode(aTHX_ a,b)
 #define regpiece(a,b)		S_regpiece(aTHX_ a,b)
 #define reginsert(a,b,c)	S_reginsert(aTHX_ a,b,c)
 #define regoptail(a,b,c)	S_regoptail(aTHX_ a,b,c)

File Added: pkgsrc/lang/perl5/patches/Attic/patch-ai
$NetBSD: patch-ai,v 1.4.36.1 2008/06/02 09:15:44 tron Exp $

Fix for
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
from
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792

--- proto.h.orig	2006-01-31 16:50:34.000000000 +0100
+++ proto.h
@@ -1748,6 +1748,7 @@ STATIC I32	S_regcurly(pTHX_ const char *
 			__attribute__warn_unused_result__;
 
 STATIC regnode*	S_reg_node(pTHX_ struct RExC_state_t *state, U8 op);
+STATIC UV	S_reg_recode(pTHX_ const char value, SV **encp);
 STATIC regnode*	S_regpiece(pTHX_ struct RExC_state_t *state, I32 *flagp);
 STATIC void	S_reginsert(pTHX_ struct RExC_state_t *state, U8 op, regnode *opnd);
 STATIC void	S_regoptail(pTHX_ struct RExC_state_t *state, regnode *p, regnode *val);

File Added: pkgsrc/lang/perl5/patches/Attic/patch-aj
$NetBSD: patch-aj,v 1.8.22.1 2008/06/02 09:15:44 tron Exp $

Fix for
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
from
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792

--- t/uni/tr_utf8.t.orig	2004-06-25 10:53:16.000000000 +0200
+++ t/uni/tr_utf8.t
@@ -31,7 +31,7 @@ BEGIN {
 }
 
 use strict;
-use Test::More tests => 7;
+use Test::More tests => 8;
 
 use encoding 'utf8';
 
@@ -67,4 +67,12 @@ is($str, $hiragana, "s/// # hiragana -> 
   $line =~ tr/bcdeghijklmnprstvwxyz$02578/בצדעגהיײקלמנפּרסטװשכיזשױתײחא/;
   is($line, "aבצדעfגהיײקלמנoפqּרסuטװשכיזש1ױ34ת6ײח9", "[perl #16843]");
 }
+
+{
+  # [perl #40641]
+  my $str = qq/Gebääääääääääääääääääääude/;
+  my $reg = qr/Gebääääääääääääääääääääude/;
+  ok($str =~ /$reg/, "[perl #40641]");
+}
+
 __END__

File Added: pkgsrc/lang/perl5/patches/Attic/patch-ak
$NetBSD: patch-ak,v 1.2.36.1 2008/06/02 09:15:44 tron Exp $

Fix for
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
from
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792

--- utf8.h.orig	2006-01-08 22:11:27.000000000 +0100
+++ utf8.h
@@ -198,6 +198,8 @@ encoded character.
 					 UTF8_ALLOW_SURROGATE|UTF8_ALLOW_FFFF)
 #define UTF8_ALLOW_ANY			0x00FF
 #define UTF8_CHECK_ONLY			0x0200
+#define UTF8_ALLOW_DEFAULT             (ckWARN(WARN_UTF8) ? 0 : \
+                                        UTF8_ALLOW_ANYUV)
 
 #define UNICODE_SURROGATE_FIRST		0xD800
 #define UNICODE_SURROGATE_LAST		0xDFFF

cvs diff -r1.1 -r1.1.6.1 pkgsrc/lang/perl5/patches/Attic/patch-da (expand / switch to unified diff)

--- pkgsrc/lang/perl5/patches/Attic/patch-da 2007/11/06 19:54:53 1.1
+++ pkgsrc/lang/perl5/patches/Attic/patch-da 2008/06/02 09:15:44 1.1.6.1
@@ -1,61 +1,150 @@ @@ -1,61 +1,150 @@
1$NetBSD: patch-da,v 1.1 2007/11/06 19:54:53 drochner Exp $ 1$NetBSD: patch-da,v 1.1.6.1 2008/06/02 09:15:44 tron Exp $
2 2
3--- regcomp.c.orig 2006-01-08 21:59:27.000000000 +0100 3Fix for
 4http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927
 5from
 6http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=26;filename=27_fix_regcomp_utf8;att=1;bug=454792
 7
 8--- regcomp.c.orig 2008-06-01 22:04:17.000000000 +0200
4+++ regcomp.c 9+++ regcomp.c
5@@ -135,7 +135,8 @@ typedef struct RExC_state_t { 10@@ -2790,6 +2790,39 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta
6 I32 extralen; 11 }
7 I32 seen_zerolen; 
8 I32 seen_evals; 
9- I32 utf8; 
10+ I32 utf8; /* pattern is utf8 or not */ 
11+ I32 orig_utf8; /* pattern was originally utf8 */ 
12 #if ADD_TO_REGEXEC 
13 char *starttry; /* -Dr: where regtry was called. */ 
14 #define RExC_starttry (pRExC_state->starttry) 
15@@ -161,6 +162,7 @@ typedef struct RExC_state_t { 
16 #define RExC_seen_zerolen (pRExC_state->seen_zerolen) 
17 #define RExC_seen_evals (pRExC_state->seen_evals) 
18 #define RExC_utf8 (pRExC_state->utf8) 
19+#define RExC_orig_utf8 (pRExC_state->orig_utf8) 
20  
21 #define ISMULT1(c) ((c) == '*' || (c) == '+' || (c) == '?') 
22 #define ISMULT2(s) ((*s) == '*' || (*s) == '+' || (*s) == '?' || \ 
23@@ -1749,15 +1751,17 @@ Perl_pregcomp(pTHX_ char *exp, char *xen 
24 if (exp == NULL) 
25 FAIL("NULL regexp argument"); 
26  12
27- RExC_utf8 = pm->op_pmdynflags & PMdf_CMP_UTF8; 13 /*
28+ RExC_orig_utf8 = RExC_utf8 = pm->op_pmdynflags & PMdf_CMP_UTF8; 14+ * reg_recode
29  15+ *
30- RExC_precomp = exp; 16+ * It returns the code point in utf8 for the value in *encp.
31 DEBUG_r({ 17+ * value: a code value in the source encoding
32 if (!PL_colorset) reginitcolors(); 18+ * encp: a pointer to an Encode object
33 PerlIO_printf(Perl_debug_log, "%sCompiling REx%s `%s%*s%s'\n", 19+ *
34 PL_colors[4],PL_colors[5],PL_colors[0], 20+ * If the result from Encode is not a single character,
35- (int)(xend - exp), RExC_precomp, PL_colors[1]); 21+ * it returns U+FFFD (Replacement character) and sets *encp to NULL.
36+ (int)(xend - exp), exp, PL_colors[1]); 22+ */
37 }); 23+STATIC UV
 24+S_reg_recode(pTHX_ const char value, SV **encp)
 25+{
 26+ STRLEN numlen = 1;
 27+ SV * const sv = sv_2mortal(newSVpvn(&value, numlen));
 28+ const char * const s = encp && *encp ? sv_recode_to_utf8(sv, *encp)
 29+ : SvPVX(sv);
 30+ const STRLEN newlen = SvCUR(sv);
 31+ UV uv = UNICODE_REPLACEMENT;
38+ 32+
39+redo_first_pass: 33+ if (newlen)
40+ RExC_precomp = exp; 34+ uv = SvUTF8(sv)
41 RExC_flags = pm->op_pmflags; 35+ ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
42 RExC_sawback = 0; 36+ : *(U8*)s;
43  37+
44@@ -1783,6 +1787,17 @@ Perl_pregcomp(pTHX_ char *exp, char *xen 38+ if (!newlen || numlen != newlen) {
45 RExC_precomp = Nullch; 39+ uv = UNICODE_REPLACEMENT;
46 return(NULL); 40+ if (encp)
47 } 41+ *encp = NULL;
48+ if (RExC_utf8 && !RExC_orig_utf8) { 
49+ STRLEN len = xend-exp; 
50+ DEBUG_r(PerlIO_printf(Perl_debug_log, 
51+ "UTF8 mismatch! Converting to utf8 for resizing and compile\n")); 
52+ exp = (char*)Perl_bytes_to_utf8(aTHX_ (U8*)exp, &len); 
53+ xend = exp + len; 
54+ RExC_orig_utf8 = RExC_utf8; 
55+ SAVEFREEPV(exp); 
56+ goto redo_first_pass; 
57+ } 42+ }
 43+ return uv;
 44+}
58+ 45+
59 DEBUG_r(PerlIO_printf(Perl_debug_log, "size %"IVdf" ", (IV)RExC_size)); 46+/*
 47 - regatom - the lowest level
 48 *
 49 * Optimization: gobbles an entire sequence of ordinary characters so that
 50@@ -3181,6 +3214,8 @@ tryagain:
 51 ender = grok_hex(p, &numlen, &flags, NULL);
 52 p += numlen;
 53 }
 54+ if (PL_encoding && ender < 0x100)
 55+ goto recode_encoding;
 56 break;
 57 case 'c':
 58 p++;
 59@@ -3200,6 +3235,17 @@ tryagain:
 60 --p;
 61 goto loopdone;
 62 }
 63+ if (PL_encoding && ender < 0x100)
 64+ goto recode_encoding;
 65+ break;
 66+ recode_encoding:
 67+ {
 68+ SV* enc = PL_encoding;
 69+ ender = reg_recode((const char)(U8)ender, &enc);
 70+ if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
 71+ vWARN(p, "Invalid escape in the specified encoding");
 72+ RExC_utf8 = 1;
 73+ }
 74 break;
 75 case '\0':
 76 if (p >= RExC_end)
 77@@ -3330,32 +3376,6 @@ tryagain:
 78 break;
 79 }
 80
 81- /* If the encoding pragma is in effect recode the text of
 82- * any EXACT-kind nodes. */
 83- if (PL_encoding && PL_regkind[(U8)OP(ret)] == EXACT) {
 84- STRLEN oldlen = STR_LEN(ret);
 85- SV *sv = sv_2mortal(newSVpvn(STRING(ret), oldlen));
 86-
 87- if (RExC_utf8)
 88- SvUTF8_on(sv);
 89- if (sv_utf8_downgrade(sv, TRUE)) {
 90- const char * const s = sv_recode_to_utf8(sv, PL_encoding);
 91- const STRLEN newlen = SvCUR(sv);
 92-
 93- if (SvUTF8(sv))
 94- RExC_utf8 = 1;
 95- if (!SIZE_ONLY) {
 96- DEBUG_r(PerlIO_printf(Perl_debug_log, "recode %*s to %*s\n",
 97- (int)oldlen, STRING(ret),
 98- (int)newlen, s));
 99- Copy(s, STRING(ret), newlen, char);
 100- STR_LEN(ret) += newlen - oldlen;
 101- RExC_emit += STR_SZ(newlen) - STR_SZ(oldlen);
 102- } else
 103- RExC_size += STR_SZ(newlen) - STR_SZ(oldlen);
 104- }
 105- }
 106-
 107 return(ret);
 108 }
60  109
61 /* Small enough for pointer-storage convention? 110@@ -3733,6 +3753,8 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta
 111 value = grok_hex(RExC_parse, &numlen, &flags, NULL);
 112 RExC_parse += numlen;
 113 }
 114+ if (PL_encoding && value < 0x100)
 115+ goto recode_encoding;
 116 break;
 117 case 'c':
 118 value = UCHARAT(RExC_parse++);
 119@@ -3740,13 +3762,24 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta
 120 break;
 121 case '0': case '1': case '2': case '3': case '4':
 122 case '5': case '6': case '7': case '8': case '9':
 123- {
 124- I32 flags = 0;
 125- numlen = 3;
 126- value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
 127- RExC_parse += numlen;
 128- break;
 129- }
 130+ {
 131+ I32 flags = 0;
 132+ numlen = 3;
 133+ value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
 134+ RExC_parse += numlen;
 135+ if (PL_encoding && value < 0x100)
 136+ goto recode_encoding;
 137+ break;
 138+ }
 139+ recode_encoding:
 140+ {
 141+ SV* enc = PL_encoding;
 142+ value = reg_recode((const char)(U8)value, &enc);
 143+ if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
 144+ vWARN(RExC_parse,
 145+ "Invalid escape in the specified encoding");
 146+ break;
 147+ }
 148 default:
 149 if (!SIZE_ONLY && isALPHA(value) && ckWARN(WARN_REGEXP))
 150 vWARN2(RExC_parse,