Rob,

Here is the full patch. It's basically all minor untainting stuff
except for the first chunk that enables UNTAINT magically under the
test suite.


Patrick

========8<==========
diff -u -r ../Inline-0.45/Inline.pm ./Inline.pm
--- ../Inline-0.45/Inline.pm    2008-11-21 04:37:07.000000000 -0500
+++ ./Inline.pm 2009-07-02 12:42:11.000000000 -0400
@@ -395,6 +395,22 @@
 #==============================================================================
 sub fold_options {
     my $o = shift;
+
+       # This bit tries to enable UNTAINT automatically if required
when running the test suite.
+       my $env_ha = $ENV{HARNESS_ACTIVE} || 0 ;
+       my ($harness_active) = $env_ha =~ /(.*)/ ;
+       if (($harness_active)&&(! $o->{CONFIG}{UNTAINT})){
+               eval {
+                       require Scalar::Util;
+                       $o->{CONFIG}{UNTAINT} =
(Scalar::Util::tainted(Cwd::cwd()) ? 1 : 0) ;
+                       # Disable SAFEMODE in the test suite, we know
what we are doing...
+                       $o->{CONFIG}{SAFEMODE} = 0 ;
+                       warn "\n-[tT] enabled for test suite.
Automatically setting UNTAINT=1 and SAFEMODE=0.\n"
+                               unless $Inline::_TAINT_WARNING_ ;
+                       $Inline::_TAINT_WARNING_ = 1 ;
+               } ;
+       }
+
     $untaint = $o->{CONFIG}{UNTAINT} || 0;
     $safemode = (($o->{CONFIG}{SAFEMODE} == -1) ?
                 ($untaint ? 1 : 0) :
@@ -1201,6 +1217,7 @@
     my @parts = File::Spec->splitdir($rmpath);
     while (@parts){
         $rmpath = File::Spec->catdir($prefix ? ($prefix,@parts) :
@parts);
+        ($rmpath) = $rmpath =~ /(.*)/ if UNTAINT;
         rmdir $rmpath
          or last; # rmdir failed because dir was not empty
        pop @parts;
@@ -1265,39 +1282,41 @@
            -w File::Spec->catdir($cwd,".Inline")) {
         $temp_dir = File::Spec->catdir($cwd,".Inline");
     }
-    elsif (require FindBin and
-           $bin = $FindBin::Bin and
-           -d File::Spec->catdir($bin,".Inline") and
-           -w File::Spec->catdir($bin,".Inline")) {
-        $temp_dir = File::Spec->catdir($bin,".Inline");
-    }
-    elsif ($home and
-           -d File::Spec->catdir($home,".Inline") and
-           -w File::Spec->catdir($home,".Inline")) {
-        $temp_dir = File::Spec->catdir($home,".Inline");
-    }
-    elsif (defined $cwd and $cwd and
-           -d File::Spec->catdir($cwd, $did) and
-           -w File::Spec->catdir($cwd, $did)) {
-        $temp_dir = File::Spec->catdir($cwd, $did);
-    }
-    elsif (defined $bin and $bin and
-           -d File::Spec->catdir($bin, $did) and
-           -w File::Spec->catdir($bin, $did)) {
-        $temp_dir = File::Spec->catdir($bin, $did);
-    }
-    elsif (defined $cwd and $cwd and
-          -d $cwd and
-          -w $cwd and
-           _mkdir(File::Spec->catdir($cwd, $did), 0777)) {
-        $temp_dir = File::Spec->catdir($cwd, $did);
-    }
-    elsif (defined $bin and $bin and
-          -d $bin and
-          -w $bin and
-           _mkdir(File::Spec->catdir($bin, $did), 0777)) {
-        $temp_dir = File::Spec->catdir($bin, $did);
-    }
+       else {
+               require FindBin ;
+        if ($bin = $FindBin::Bin and
+               -d File::Spec->catdir($bin,".Inline") and
+               -w File::Spec->catdir($bin,".Inline")) {
+            $temp_dir = File::Spec->catdir($bin,".Inline");
+        }
+        elsif ($home and
+               -d File::Spec->catdir($home,".Inline") and
+               -w File::Spec->catdir($home,".Inline")) {
+            $temp_dir = File::Spec->catdir($home,".Inline");
+        }
+        elsif (defined $cwd and $cwd and
+               -d File::Spec->catdir($cwd, $did) and
+               -w File::Spec->catdir($cwd, $did)) {
+            $temp_dir = File::Spec->catdir($cwd, $did);
+        }
+        elsif (defined $bin and $bin and
+               -d File::Spec->catdir($bin, $did) and
+               -w File::Spec->catdir($bin, $did)) {
+            $temp_dir = File::Spec->catdir($bin, $did);
+        }
+        elsif (defined $cwd and $cwd and
+          -d $cwd and
+          -w $cwd and
+               _mkdir(File::Spec->catdir($cwd, $did), 0777)) {
+            $temp_dir = File::Spec->catdir($cwd, $did);
+        }
+        elsif (defined $bin and $bin and
+          -d $bin and
+          -w $bin and
+               _mkdir(File::Spec->catdir($bin, $did), 0777)) {
+            $temp_dir = File::Spec->catdir($bin, $did);
+        }
+       }

     croak M56_no_DIRECTORY_found()
       unless $temp_dir;
diff -u -r ../Inline-0.45/lib/Inline/Foo.pm ./lib/Inline/Foo.pm
--- ../Inline-0.45/lib/Inline/Foo.pm    2008-11-01 02:00:03.000000000 -0400
+++ ./lib/Inline/Foo.pm 2009-07-01 21:00:39.000000000 -0400
@@ -50,6 +50,7 @@
     my $pattern = $o->{ILSM}{PATTERN};
     $code =~ s/$pattern//g;
     $code =~ s/bar-//g if $o->{ILSM}{BAR};
+       ($code) = $code =~ /(.*)/s if $o->{CONFIG}{UNTAINT} ;
     sleep 1; # imitate compile delay
     {
        package Foo::Tester;
@@ -58,6 +59,7 @@
     croak "Foo build failed:\n$@" if $@;
     my $path =
File::Spec->catdir($o->{API}{install_lib},'auto',$o->{API}{modpname});
     my $obj = $o->{API}{location};
+       ($obj) = $obj =~ /(.*)/ if $o->{CONFIG}{UNTAINT} ;
     $o->mkpath($path) unless -d $path;
     open FOO_OBJ, "> $obj"
       or croak "Can't open $obj for output\n$!";
@@ -71,6 +73,7 @@
     open FOO_OBJ, "< $obj"
       or croak "Can't open $obj for output\n$!";
     my $code = join '', <FOO_OBJ>;
+       ($code) = $code =~ /(.*)/s if $o->{CONFIG}{UNTAINT} ;
     close \*FOO_OBJ;
     eval "package $o->{API}{pkg};\n$code";
     croak "Unable to load Foo module $obj:\n$@" if $@;
diff -u -r ../Inline-0.45/lib/Inline/denter.pm ./lib/Inline/denter.pm
--- ../Inline-0.45/lib/Inline/denter.pm 2008-11-01 02:00:03.000000000 -0400
+++ ./lib/Inline/denter.pm      2009-07-02 11:29:24.000000000 -0400
@@ -13,6 +13,9 @@
          }, $class;
 }

+sub DESTROY {
+}
+
 sub undent {
     local $/ = "\n";
     my ($o, $text) = @_;
========8<==========






On Thu, Jul 2, 2009 at 6:13 PM, Sisyphus<sisyph...@optusnet.com.au> wrote:
>
> ----- Original Message ----- From: "Patrick LeBoutillier"
> <patrick.leboutill...@gmail.com>
> To: "Sisyphus" <sisyph...@optusnet.com.au>
> Cc: "inline" <inline@perl.org>
> Sent: Friday, July 03, 2009 3:03 AM
> Subject: Re: Inline and -T
>
>
>> Rob,
>>
>> I took a stab at it this morning. Basically I tried to do 2 things:
>>
>> - Get the small test script to run cleanly under UNTAINT;
>> - Try to get the test suite to behave properly when run under -T (by
>> way of the HARNESS_PERL_SWITCHES env var). That way it's easy to
>> perioically run the test suite with -T and see if somoe new taint bugs
>> have crept in.
>>
>> To fix the former 2 small patches seem to be required: one for
>> Inline.pm and one for denter.pm:
>>
>> Inline.pm:
>> @@ -1201,6 +1217,7 @@
>>    my @parts = File::Spec->splitdir($rmpath);
>>    while (@parts){
>>        $rmpath = File::Spec->catdir($prefix ? ($prefix,@parts) :
>> @parts);
>> +        ($rmpath) = $rmpath =~ /(.*)/ if UNTAINT;
>>        rmdir $rmpath
>>         or last; # rmdir failed because dir was not empty
>>       pop @parts;
>>
>> denter.pm (without this a taint exception is thrown by AutoLoader.pm):
>> @@ -13,6 +13,9 @@
>>         }, $class;
>> }
>>
>> +sub DESTROY {
>> +}
>> +
>>
>>
>> To fix the latter, a mechanism needs to be put in place in Inline.pm
>> so that it activates UNTAINT automatically (only when -T is set  and
>> when we are running under the test harness). Also, the test suite
>> makes liberal use of relative paths in @INC, which throws off a few
>> taint exceptions. Finally, the Inline::Foo module used in the test
>> suite needs some untainting in some places.
>>
>> I have a patch for this also, but it's larger than the other two. Rob,
>> what format is preferable for the patch?
>>
>
> Just post it as an attachment should be fine, I think.
> I'll give the patches a try in a day or two when I have time. (I have to
> head off in about half an hour - won't get back until tomorrow evening.)
> Thanks heaps for that, Patrick !!
>
>> BTW: I wasn't able to reproduce Rob's build problem with the small
>> test script below. It ran fine (without -T) on my test env (Linux
>> FC10, x64, perl 5.10.0).
>>
>
> Hmmm .... I'm still stuck on that. It may be something Windows-specific. I'm
> actually having trouble working out what "$o->env_untaint if UNTAINT;" in
> Inline.pm's sub glue is doing. (It's called twice, within a few lines of
> each othr.) Afaict it should be calling env_untaint() in the same file, but
> it doesn't seem to be doing that ... very, very weird.
> I can verify that the line of code is being executed (and that UNTAINT is
> true), but env_untaint() is not being run.
> Same goes for "$o->obj_untaint if UNTAINT;" (called once) in the same sub.
>
> Cheers,
> Rob
>
>
>
>



-- 
=====================
Patrick LeBoutillier
Rosemère, Québec, Canada

Reply via email to