This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Test case for C<undef %File::Glob::>
[perl5.git] / t / op / taint.t
index fdd1c79..2958a37 100755 (executable)
@@ -9,7 +9,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
 }
 
 use strict;
@@ -19,11 +19,21 @@ use Config;
 # just because Errno possibly failing.
 eval { require Errno; import Errno };
 
+use vars qw($ipcsysv); # did we manage to load IPC::SysV?
+
 BEGIN {
   if ($^O eq 'VMS' && !defined($Config{d_setenv})) {
       $ENV{PATH} = $ENV{PATH};
       $ENV{TERM} = $ENV{TERM} ne ''? $ENV{TERM} : 'dummy';
   }
+  if ($Config{'extensions'} =~ /\bIPC\/SysV\b/
+      && ($Config{d_shm} || $Config{d_msg})) {
+      eval { require IPC::SysV };
+      unless ($@) {
+         $ipcsysv++;
+         IPC::SysV->import(qw(IPC_PRIVATE IPC_RMID IPC_CREAT S_IRWXU));
+      }
+  }
 }
 
 my $Is_VMS = $^O eq 'VMS';
@@ -94,7 +104,7 @@ print PROG 'print "@ARGV\n"', "\n";
 close PROG;
 my $echo = "$Invoke_Perl $ECHO";
 
-print "1..149\n";
+print "1..155\n";
 
 # First, let's make sure that Perl is checking the dangerous
 # environment variables. Maybe they aren't set yet, so we'll
@@ -137,7 +147,7 @@ print "1..149\n";
     }
     else {
        $tmp = (grep { defined and -d and (stat _)[2] & 2 }
-                    qw(/tmp /var/tmp /usr/tmp /sys$scratch),
+                    qw(sys$scratch /tmp /var/tmp /usr/tmp),
                     @ENV{qw(TMP TEMP)})[0]
            or print "# can't find world-writeable directory to test PATH\n";
     }
@@ -254,7 +264,8 @@ print "1..149\n";
 
 # Globs should be forbidden, except under VMS,
 #   which doesn't spawn an external program.
-if ($Is_VMS) {
+if (1  # built-in glob
+    or $Is_VMS) {
     for (35..36) { print "ok $_\n"; }
 }
 else {
@@ -546,14 +557,14 @@ else {
        my @getpwent = getpwent();
        die "getpwent: $!\n" unless (@getpwent);
        test 142,(    not tainted $getpwent[0]
-                 and not tainted $getpwent[1]
+                 and     tainted $getpwent[1]
                  and not tainted $getpwent[2]
                  and not tainted $getpwent[3]
                  and not tainted $getpwent[4]
                  and not tainted $getpwent[5]
-                 and     tainted $getpwent[6] # gecos
+                 and     tainted $getpwent[6]          # ge?cos
                  and not tainted $getpwent[7]
-                 and not tainted $getpwent[8]);
+                 and     tainted $getpwent[8]);        # shell
        endpwent();
     } else {
        for (142) { print "ok $_ # Skipped: getpwent() is not available\n" }
@@ -604,3 +615,121 @@ else {
     $why =~ s/e/'-'.$$/ge;
     test 149,     tainted $why;
 }
+
+# test shmread
+{
+    unless ($ipcsysv) {
+       print "ok 150 # skipped: no IPC::SysV\n";
+       last;
+    }
+    if ($Config{'extensions'} =~ /\bIPC\/SysV\b/ && $Config{d_shm}) {
+       no strict 'subs';
+       my $sent = "foobar";
+       my $rcvd;
+       my $size = 2000;
+       my $id = shmget(IPC_PRIVATE, $size, S_IRWXU);
+
+       if (defined $id) {
+           if (shmwrite($id, $sent, 0, 60)) {
+               if (shmread($id, $rcvd, 0, 60)) {
+                   substr($rcvd, index($rcvd, "\0")) = '';
+               } else {
+                   warn "# shmread failed: $!\n";
+               }
+           } else {
+               warn "# shmwrite failed: $!\n";
+           }
+           shmctl($id, IPC_RMID, 0) or warn "# shmctl failed: $!\n";
+       } else {
+           warn "# shmget failed: $!\n";
+       }
+
+       if ($rcvd eq $sent) {
+           test 150, tainted $rcvd;
+       } else {
+           print "ok 150 # Skipped: SysV shared memory operation failed\n";
+       }
+    } else {
+       print "ok 150 # Skipped: SysV shared memory is not available\n";
+    }
+}
+
+# test msgrcv
+{
+    unless ($ipcsysv) {
+       print "ok 151 # skipped: no IPC::SysV\n";
+       last;
+    }
+    if ($Config{'extensions'} =~ /\bIPC\/SysV\b/ && $Config{d_msg}) {
+       no strict 'subs';
+       my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRWXU);
+
+       my $sent      = "message";
+       my $type_sent = 1234;
+       my $rcvd;
+       my $type_rcvd;
+
+       if (defined $id) {
+           if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) {
+               if (msgrcv($id, $rcvd, 60, 0, 0)) {
+                   ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd);
+               } else {
+                   warn "# msgrcv failed\n";
+               }
+           } else {
+               warn "# msgsnd failed\n";
+           }
+           msgctl($id, IPC_RMID, 0) or warn "# msgctl failed: $!\n";
+       } else {
+           warn "# msgget failed\n";
+       }
+
+       if ($rcvd eq $sent && $type_sent == $type_rcvd) {
+           test 151, tainted $rcvd;
+       } else {
+           print "ok 151 # Skipped: SysV message queue operation failed\n";
+       }
+    } else {
+       print "ok 151 # Skipped: SysV message queues are not available\n";
+    }
+}
+
+{
+    # bug id 20001004.006
+
+    open IN, "./TEST" or warn "$0: cannot read ./TEST: $!" ;
+    local $/;
+    my $a = <IN>;
+    my $b = <IN>;
+    print "not " unless tainted($a) && tainted($b) && !defined($b);
+    print "ok 152\n";
+    close IN;
+}
+
+{
+    # bug id 20001004.007
+
+    open IN, "./TEST" or warn "$0: cannot read ./TEST: $!" ;
+    my $a = <IN>;
+
+    my $c = { a => 42,
+             b => $a };
+    print "not " unless !tainted($c->{a}) && tainted($c->{b});
+    print "ok 153\n";
+
+    my $d = { a => $a,
+             b => 42 };
+    print "not " unless tainted($d->{a}) && !tainted($d->{b});
+    print "ok 154\n";
+
+    my $e = { a => 42,
+             b => { c => $a, d => 42 } };
+    print "not " unless !tainted($e->{a}) &&
+                       !tainted($e->{b}) &&
+                        tainted($e->{b}->{c}) &&
+                       !tainted($e->{b}->{d});
+    print "ok 155\n";
+
+    close IN;
+}
+