This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #122669] Don’t taint at compile time
authorFather Chrysostomos <sprout@cpan.org>
Sun, 31 Aug 2014 21:10:45 +0000 (14:10 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 31 Aug 2014 21:12:55 +0000 (14:12 -0700)
commit64ff300be0f7714585466af5bb87b2e37db5082a
tree5833d209d1f009443db57a5516a9813bc9328c94
parent0286dbbe232b42269df3d1b10663cd203ce0916d
[perl #122669] Don’t taint at compile time

 #!perl -T

 # tainted constant
 use constant K=>$^X;

 # Just reading the constant for the sake of folding can enabled
 # taintedness at compile time.
 0 if K;

 # Taintedness is still on when the ‘strict.pm’ SV is created, so
 # require croaks on it (‘Insecure dependency’).
 use strict;

The fix is simply not to propagate taintedness at compile time.
Hence, the value of K will still be tainted at run time (require(K)
croaks), but just reading the value of K at compile time won’t taint
subsequent string literals (or barewords treated as strings).

‘Compile time’ here is relative:  Taintedness still wafts about as
usual when BEGIN blocks are executed, because code is actually run-
ning.  It’s when code is being parsed that propagation is disabled.

The reason taint propagation could span across statements at compile
time was that *execution* of a new statement resets taintedness,
whereas parsing is oblivious to it.
mg.c
t/op/taint.t