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.diff -r1.136 -r1.136.2.1 pkgsrc/lang/perl5/Makefile
(tron)
@@ -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 | |||
3 | DISTNAME= perl-5.8.8 | 3 | DISTNAME= perl-5.8.8 | |
4 | PKGREVISION= 7 | 4 | PKGREVISION= 8 | |
5 | CATEGORIES= lang devel perl5 | 5 | CATEGORIES= lang devel perl5 | |
6 | MASTER_SITES= ${MASTER_SITE_PERL_CPAN:S,/modules/by-module/$,/src/,} | 6 | MASTER_SITES= ${MASTER_SITE_PERL_CPAN:S,/modules/by-module/$,/src/,} | |
7 | EXTRACT_SUFX= .tar.bz2 | 7 | EXTRACT_SUFX= .tar.bz2 | |
8 | DISTFILES+= ${DISTNAME}${EXTRACT_SUFX} | 8 | DISTFILES+= ${DISTNAME}${EXTRACT_SUFX} | |
9 | 9 | |||
10 | MAINTAINER= jlam@pkgsrc.org | 10 | MAINTAINER= jlam@pkgsrc.org | |
11 | HOMEPAGE= http://www.perl.org/ | 11 | HOMEPAGE= http://www.perl.org/ | |
12 | COMMENT= Practical Extraction and Report Language | 12 | COMMENT= Practical Extraction and Report Language | |
13 | #LICENSE= gnu-gpl-v2 | 13 | #LICENSE= gnu-gpl-v2 | |
14 | 14 | |||
15 | PKG_DESTDIR_SUPPORT= user-destdir | 15 | PKG_DESTDIR_SUPPORT= user-destdir | |
16 | 16 | |||
17 | CONFLICTS= perl-base-[0-9]* perl-thread-[0-9]* \ | 17 | CONFLICTS= perl-base-[0-9]* perl-thread-[0-9]* \ |
@@ -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 | |||
3 | SHA1 (perl-5.8.8.tar.bz2) = 4aab490040727ca4419098720eca2ba4367df539 | 3 | SHA1 (perl-5.8.8.tar.bz2) = 4aab490040727ca4419098720eca2ba4367df539 | |
4 | RMD160 (perl-5.8.8.tar.bz2) = e78f26d9b96e6db35f946ad4ff55e3a69385c71b | 4 | RMD160 (perl-5.8.8.tar.bz2) = e78f26d9b96e6db35f946ad4ff55e3a69385c71b | |
5 | Size (perl-5.8.8.tar.bz2) = 10123359 bytes | 5 | Size (perl-5.8.8.tar.bz2) = 10123359 bytes | |
6 | SHA1 (patch-aa) = 9b6844635086206dc7740103747a2b54bf987941 | 6 | SHA1 (patch-aa) = 9b6844635086206dc7740103747a2b54bf987941 | |
7 | SHA1 (patch-ab) = e32427327192f023477b16f29bc55fdf4f057410 | 7 | SHA1 (patch-ab) = e32427327192f023477b16f29bc55fdf4f057410 | |
8 | SHA1 (patch-ac) = 428e0757495b82a47ec092a71333fb3ec366f14f | 8 | SHA1 (patch-ac) = 428e0757495b82a47ec092a71333fb3ec366f14f | |
9 | SHA1 (patch-ad) = 914e1c74555a9b6a0256992a694b2ba609f29786 | |||
9 | SHA1 (patch-ae) = 287ac0d97a5372c8b45457129f3e70fe42cf69e2 | 10 | SHA1 (patch-ae) = 287ac0d97a5372c8b45457129f3e70fe42cf69e2 | |
11 | SHA1 (patch-af) = b11574297e46b910f206f09702effc6cc272b0fd | |||
12 | SHA1 (patch-ag) = 0122ec30b8fcd17198e068d07e95974bee0945b6 | |||
10 | SHA1 (patch-ah) = 25443063c26287b1b8130c53d5c9d92248d4c0d1 | 13 | SHA1 (patch-ah) = 25443063c26287b1b8130c53d5c9d92248d4c0d1 | |
14 | SHA1 (patch-ai) = 4a07c6268a1e27b73f2f6fcde86f788fce77fcbd | |||
15 | SHA1 (patch-aj) = a2fc32766ed8556455c60780fe242a034ce491a9 | |||
16 | SHA1 (patch-ak) = 8899f8b6d1d038b950979073cb0527c8e7afca1e | |||
11 | SHA1 (patch-am) = cf1687063d0c0542e811545aaaad291bad12d75e | 17 | SHA1 (patch-am) = cf1687063d0c0542e811545aaaad291bad12d75e | |
12 | SHA1 (patch-an) = 987763c3098bf4356993dd6d8741962a1ff8190d | 18 | SHA1 (patch-an) = 987763c3098bf4356993dd6d8741962a1ff8190d | |
13 | SHA1 (patch-ap) = 178d6909a8aa6544b849c2b63530fcf1893b77ea | 19 | SHA1 (patch-ap) = 178d6909a8aa6544b849c2b63530fcf1893b77ea | |
14 | SHA1 (patch-aq) = b9569d0cd74a06912e82498cd2bfba131c0b6f3b | 20 | SHA1 (patch-aq) = b9569d0cd74a06912e82498cd2bfba131c0b6f3b | |
15 | SHA1 (patch-ar) = 9d257ceeca337e3d477b80215560bbc290d19dd2 | 21 | SHA1 (patch-ar) = 9d257ceeca337e3d477b80215560bbc290d19dd2 | |
16 | SHA1 (patch-as) = 371827db418eac11f0b49df45e9d587106908bf0 | 22 | SHA1 (patch-as) = 371827db418eac11f0b49df45e9d587106908bf0 | |
17 | SHA1 (patch-ba) = 27aefd5043c251380ac607df54fff882f689f237 | 23 | SHA1 (patch-ba) = 27aefd5043c251380ac607df54fff882f689f237 | |
18 | SHA1 (patch-ca) = 5ed14e043a6d5f8dadf5711b59418f01aa5f6f21 | 24 | SHA1 (patch-ca) = 5ed14e043a6d5f8dadf5711b59418f01aa5f6f21 | |
19 | SHA1 (patch-cb) = 2cbcaa476f33c270bfea50cddd0da3f476dbe689 | 25 | SHA1 (patch-cb) = 2cbcaa476f33c270bfea50cddd0da3f476dbe689 | |
20 | SHA1 (patch-ce) = 6b1efab32c6bc28e0faf7522322e6d805eb21730 | 26 | SHA1 (patch-ce) = 6b1efab32c6bc28e0faf7522322e6d805eb21730 | |
21 | SHA1 (patch-ch) = a0831869e23d4a66588e6e27eecedb08527c9498 | 27 | SHA1 (patch-ch) = a0831869e23d4a66588e6e27eecedb08527c9498 | |
22 | SHA1 (patch-ci) = fe943f07044efa457d163eb86974ea10bb356226 | 28 | SHA1 (patch-ci) = fe943f07044efa457d163eb86974ea10bb356226 | |
23 | SHA1 (patch-cj) = 3f40f1b166a054d55224c3e79d74516ca608b696 | 29 | SHA1 (patch-cj) = 3f40f1b166a054d55224c3e79d74516ca608b696 | |
24 | SHA1 (patch-ck) = 28207b8186c9ad194a1edc696159915bc16d1097 | 30 | SHA1 (patch-ck) = 28207b8186c9ad194a1edc696159915bc16d1097 | |
25 | SHA1 (patch-cn) = b5e56787fb9ca10025e9061d7bfd2da549ee3fa3 | 31 | SHA1 (patch-cn) = b5e56787fb9ca10025e9061d7bfd2da549ee3fa3 | |
26 | SHA1 (patch-da) = b25f30544dd679d95997cafb7e427a41f98884b1 | 32 | SHA1 (patch-da) = 24c8783fcdbead35de20bc3cecf1627a64717853 | |
27 | SHA1 (patch-ta) = ca0d1e4bc2dbbc4b86a087fed27cd1e7bbb2873f | 33 | SHA1 (patch-ta) = ca0d1e4bc2dbbc4b86a087fed27cd1e7bbb2873f | |
28 | SHA1 (patch-zc) = 0c61b6028813e0f80bfe0760a1e74e3037d37cdd | 34 | SHA1 (patch-zc) = 0c61b6028813e0f80bfe0760a1e74e3037d37cdd |
$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
$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
$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)
$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);
$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__
$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
@@ -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 | 3 | Fix for | |
4 | http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1927 | |||
5 | from | |||
6 | http://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, |