| Line | |
|---|
| 1 | #!perl
|
|---|
| 2 |
|
|---|
| 3 | BEGIN {
|
|---|
| 4 | if ($ENV{PERL_CORE}) {
|
|---|
| 5 | chdir 't' if -d 't';
|
|---|
| 6 | @INC = '../lib';
|
|---|
| 7 | }
|
|---|
| 8 | require Config; import Config;
|
|---|
| 9 | if ($Config{'extensions'} !~ /\bOpcode\b/
|
|---|
| 10 | && $Config{'extensions'} !~ /\bPOSIX\b/
|
|---|
| 11 | && $Config{'osname'} ne 'VMS')
|
|---|
| 12 | {
|
|---|
| 13 | print "1..0\n";
|
|---|
| 14 | exit 0;
|
|---|
| 15 | }
|
|---|
| 16 | }
|
|---|
| 17 |
|
|---|
| 18 | use strict;
|
|---|
| 19 | use warnings;
|
|---|
| 20 | use POSIX qw(ceil);
|
|---|
| 21 | use Test::More tests => 2;
|
|---|
| 22 | use Safe;
|
|---|
| 23 |
|
|---|
| 24 | my $safe = new Safe;
|
|---|
| 25 | $safe->deny('add');
|
|---|
| 26 |
|
|---|
| 27 | my $masksize = ceil( Opcode::opcodes / 8 );
|
|---|
| 28 | # Attempt to change the opmask from within the safe compartment
|
|---|
| 29 | $safe->reval( qq{\$_[1] = qq/\0/ x } . $masksize );
|
|---|
| 30 |
|
|---|
| 31 | # Check that it didn't work
|
|---|
| 32 | $safe->reval( q{$x + $y} );
|
|---|
| 33 | like( $@, qr/^'?addition \(\+\)'? trapped by operation mask/,
|
|---|
| 34 | 'opmask still in place with reval' );
|
|---|
| 35 |
|
|---|
| 36 | my $safe2 = new Safe;
|
|---|
| 37 | $safe2->deny('add');
|
|---|
| 38 |
|
|---|
| 39 | open my $fh, '>nasty.pl' or die "Can't write nasty.pl: $!\n";
|
|---|
| 40 | print $fh <<EOF;
|
|---|
| 41 | \$_[1] = "\0" x $masksize;
|
|---|
| 42 | EOF
|
|---|
| 43 | close $fh;
|
|---|
| 44 | $safe2->rdo('nasty.pl');
|
|---|
| 45 | $safe2->reval( q{$x + $y} );
|
|---|
| 46 | like( $@, qr/^'?addition \(\+\)'? trapped by operation mask/,
|
|---|
| 47 | 'opmask still in place with rdo' );
|
|---|
| 48 | END { unlink 'nasty.pl' }
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.