summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-10-29 19:56:18 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-11-06 01:13:46 -0700
commitf1c31c527b5fd97a0d6c39c815e40a37674881ca (patch)
tree35237861fdc41cd644f21efaf6f146c3cfc0d54c
parentcc7b5b23f454a503cb20d27859ae5c49d0a911e3 (diff)
downloadperl-f1c31c527b5fd97a0d6c39c815e40a37674881ca.tar.gz
Forbid source filters in Unicode evals
Source filters have always been byte-level filters. Therefore they don’t make sense on Unicode strings, unless we are planning to add new APIs to support it. Until then, croak.
-rw-r--r--ext/XS-APItest/t/eval-filter.t11
-rw-r--r--pod/perldiag.pod7
-rw-r--r--toke.c3
3 files changed, 20 insertions, 1 deletions
diff --git a/ext/XS-APItest/t/eval-filter.t b/ext/XS-APItest/t/eval-filter.t
index 8d370e59a7..d4a9153613 100644
--- a/ext/XS-APItest/t/eval-filter.t
+++ b/ext/XS-APItest/t/eval-filter.t
@@ -1,9 +1,18 @@
#!perl -w
use strict;
-use Test::More tests => 1;
+use Test::More tests => 3;
use XS::APItest;
+{
+ use feature "unicode_eval";
+ my $unfiltered_foo = "foo";
+ eval "BEGIN { filter() }";
+ like $@, qr/^Source filters apply only to byte streams at /,
+ 'filters die under unicode_eval';
+ is "foo", $unfiltered_foo, 'filters leak not out of unicode evals';
+}
+
BEGIN { eval "BEGIN{ filter() }" }
is "foo", "fee", "evals share filters with the currently compiling scope";
diff --git a/pod/perldiag.pod b/pod/perldiag.pod
index a477db85d2..20ee6415bd 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -4334,6 +4334,13 @@ But before sort was a keyword, people sometimes used it as a filehandle.
(F) A sort comparison subroutine may not return a list value with more
or less than one element. See L<perlfunc/sort>.
+=item Source filters apply only to byte streams
+
+(F) You tried to activate a source filter (usually by loading a
+source filter module) within a string passed to C<eval>. This is
+not permitted under the C<unicode_eval> feature. Consider using
+C<evalbytes> instead. See L<feature>.
+
=item splice() offset past end of array
(W misc) You attempted to specify an offset that was past the end of
diff --git a/toke.c b/toke.c
index 43ca704cc9..3720a83101 100644
--- a/toke.c
+++ b/toke.c
@@ -3839,6 +3839,9 @@ Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
if (!PL_parser)
return NULL;
+ if (PL_parser->lex_flags & LEX_IGNORE_UTF8_HINTS)
+ Perl_croak(aTHX_ "Source filters apply only to byte streams");
+
if (!PL_rsfp_filters)
PL_rsfp_filters = newAV();
if (!datasv)