1#!perl 2# Tests that all ops can be trapped by a Safe compartment 3 4BEGIN { 5 unless ($ENV{PERL_CORE}) { 6 # this won't work outside of the core, so exit 7 print "1..0 # skipped: PERL_CORE unset\n"; exit 0; 8 } 9} 10use Config; 11BEGIN { 12 if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') { 13 print "1..0\n"; exit 0; 14 } 15} 16 17use strict; 18use Test::More; 19use Safe; 20 21# Read the op names and descriptions directly from opcode.pl 22my @op; 23my %code; 24 25while (<DATA>) { 26 chomp; 27 die "Can't match $_" unless /^([a-z_0-9]+)\t+(.*)/; 28 $code{$1} = $2; 29} 30 31open my $fh, '<', '../../opcode.pl' or die "Can't open opcode.pl: $!"; 32while (<$fh>) { 33 last if /^__END__/; 34} 35while (<$fh>) { 36 chomp; 37 next if !$_ or /^#/; 38 my ($op, $opname) = split /\t+/; 39 push @op, [$op, $opname, $code{$op}]; 40} 41close $fh; 42 43plan(tests => scalar @op); 44 45sub testop { 46 my ($op, $opname, $code) = @_; 47 pass("$op : skipped") and return if $code =~ /^SKIP/; 48 pass("$op : skipped") and return if $code =~ m://|~~: && $] < 5.010; 49 my $c = new Safe; 50 $c->deny_only($op); 51 $c->reval($code); 52 like($@, qr/'\Q$opname\E' trapped by operation mask/, $op); 53} 54 55foreach (@op) { 56 if ($_->[2]) { 57 testop @$_; 58 } else { 59 local $TODO = "No test yet for $_->[1]"; 60 fail(); 61 } 62} 63 64# things that begin with SKIP are skipped, for various reasons (notably 65# optree modified by the optimizer -- Safe checks are done before the 66# optimizer modifies the optree) 67 68__DATA__ 69null SKIP 70stub SKIP 71scalar scalar $x 72pushmark print @x 73wantarray wantarray 74const 42 75gvsv SKIP (set by optimizer) $x 76gv SKIP *x 77gelem *x{SCALAR} 78padsv SKIP my $x 79padav SKIP my @x 80padhv SKIP my %x 81padany SKIP (not implemented) 82pushre SKIP split /foo/ 83rv2gv *x 84rv2sv $x 85av2arylen $#x 86rv2cv f() 87anoncode sub { } 88prototype prototype 'foo' 89refgen \($x,$y) 90srefgen SKIP \$x 91ref ref 92bless bless 93backtick qx/ls/ 94glob <*.c> 95readline <FH> 96rcatline SKIP (set by optimizer) $x .= <F> 97regcmaybe SKIP (internal) 98regcreset SKIP (internal) 99regcomp SKIP (internal) 100match /foo/ 101qr qr/foo/ 102subst s/foo/bar/ 103substcont SKIP (set by optimizer) 104trans y:z:t: 105sassign $x = $y 106aassign @x = @y 107chop chop @foo 108schop chop 109chomp chomp @foo 110schomp chomp 111defined defined 112undef undef 113study study 114pos pos 115preinc ++$i 116i_preinc SKIP (set by optimizer) 117predec --$i 118i_predec SKIP (set by optimizer) 119postinc $i++ 120i_postinc SKIP (set by optimizer) 121postdec $i-- 122i_postdec SKIP (set by optimizer) 123pow $x ** $y 124multiply $x * $y 125i_multiply SKIP (set by optimizer) 126divide $x / $y 127i_divide SKIP (set by optimizer) 128modulo $x % $y 129i_modulo SKIP (set by optimizer) 130repeat $x x $y 131add $x + $y 132i_add SKIP (set by optimizer) 133subtract $x - $y 134i_subtract SKIP (set by optimizer) 135concat $x . $y 136stringify "$x" 137left_shift $x << 1 138right_shift $x >> 1 139lt $x < $y 140i_lt SKIP (set by optimizer) 141gt $x > $y 142i_gt SKIP (set by optimizer) 143le $i <= $y 144i_le SKIP (set by optimizer) 145ge $i >= $y 146i_ge SKIP (set by optimizer) 147eq $x == $y 148i_eq SKIP (set by optimizer) 149ne $x != $y 150i_ne SKIP (set by optimizer) 151ncmp $i <=> $y 152i_ncmp SKIP (set by optimizer) 153slt $x lt $y 154sgt $x gt $y 155sle $x le $y 156sge $x ge $y 157seq $x eq $y 158sne $x ne $y 159scmp $x cmp $y 160bit_and $x & $y 161bit_xor $x ^ $y 162bit_or $x | $y 163negate -$x 164i_negate SKIP (set by optimizer) 165not !$x 166complement ~$x 167atan2 atan2 1 168sin sin 1 169cos cos 1 170rand rand 171srand srand 172exp exp 1 173log log 1 174sqrt sqrt 1 175int int 176hex hex 177oct oct 178abs abs 179length length 180substr substr $x, 1 181vec vec 182index index 183rindex rindex 184sprintf sprintf '%s', 'foo' 185formline formline 186ord ord 187chr chr 188crypt crypt 'foo','bar' 189ucfirst ucfirst 190lcfirst lcfirst 191uc uc 192lc lc 193quotemeta quotemeta 194rv2av @a 195aelemfast SKIP (set by optimizer) 196aelem $a[1] 197aslice @a[1,2] 198each each %h 199values values %h 200keys keys %h 201delete delete $h{Key} 202exists exists $h{Key} 203rv2hv %h 204helem $h{kEy} 205hslice @h{kEy} 206unpack unpack 207pack pack 208split split /foo/ 209join join $a, @b 210list @x = (1,2) 211lslice SKIP @x[1,2] 212anonlist [1,2] 213anonhash { a => 1 } 214splice splice @x, 1, 2, 3 215push push @x, $x 216pop pop @x 217shift shift @x 218unshift unshift @x 219sort sort @x 220reverse reverse @x 221grepstart grep { $_ eq 'foo' } @x 222grepwhile SKIP grep { $_ eq 'foo' } @x 223mapstart map $_ + 1, @foo 224mapwhile SKIP (set by optimizer) 225range SKIP 226flip 1..2 227flop 1..2 228and $x && $y 229or $x || $y 230xor $x xor $y 231cond_expr $x ? 1 : 0 232andassign $x &&= $y 233orassign $x ||= $y 234method Foo->$x() 235entersub f() 236leavesub sub f{} f() 237leavesublv sub f:lvalue{return $x} f() 238caller caller 239warn warn 240die die 241reset reset 242lineseq SKIP 243nextstate SKIP 244dbstate SKIP (needs debugger) 245unstack while(0){} 246enter SKIP 247leave SKIP 248scope SKIP 249enteriter SKIP 250iter SKIP 251enterloop SKIP 252leaveloop SKIP 253return return 254last last 255next next 256redo redo THIS 257dump dump 258goto goto THERE 259exit exit 0 260open open FOO 261close close FOO 262pipe_op pipe FOO,BAR 263fileno fileno FOO 264umask umask 0755, 'foo' 265binmode binmode FOO 266tie tie 267untie untie 268tied tied 269dbmopen dbmopen 270dbmclose dbmclose 271sselect SKIP (set by optimizer) 272select select FOO 273getc getc FOO 274read read FOO 275enterwrite write 276leavewrite SKIP 277prtf printf 278print print 279sysopen sysopen 280sysseek sysseek 281sysread sysread 282syswrite syswrite 283send send 284recv recv 285eof eof FOO 286tell tell 287seek seek FH, $pos, $whence 288truncate truncate FOO, 42 289fcntl fcntl 290ioctl ioctl 291flock flock FOO, 1 292socket socket 293sockpair socketpair 294bind bind 295connect connect 296listen listen 297accept accept 298shutdown shutdown 299gsockopt getsockopt 300ssockopt setsockopt 301getsockname getsockname 302getpeername getpeername 303lstat lstat FOO 304stat stat FOO 305ftrread -R 306ftrwrite -W 307ftrexec -X 308fteread -r 309ftewrite -w 310fteexec -x 311ftis -e 312fteowned SKIP -O 313ftrowned SKIP -o 314ftzero -z 315ftsize -s 316ftmtime -M 317ftatime -A 318ftctime -C 319ftsock -S 320ftchr -c 321ftblk -b 322ftfile -f 323ftdir -d 324ftpipe -p 325ftlink -l 326ftsuid -u 327ftsgid -g 328ftsvtx -k 329fttty -t 330fttext -T 331ftbinary -B 332chdir chdir '/' 333chown chown 334chroot chroot 335unlink unlink 'foo' 336chmod chmod 511, 'foo' 337utime utime 338rename rename 'foo', 'bar' 339link link 'foo', 'bar' 340symlink symlink 'foo', 'bar' 341readlink readlink 'foo' 342mkdir mkdir 'foo' 343rmdir rmdir 'foo' 344open_dir opendir DIR 345readdir readdir DIR 346telldir telldir DIR 347seekdir seekdir DIR, $pos 348rewinddir rewinddir DIR 349closedir closedir DIR 350fork fork 351wait wait 352waitpid waitpid 353system system 354exec exec 355kill kill 356getppid getppid 357getpgrp getpgrp 358setpgrp setpgrp 359getpriority getpriority 360setpriority setpriority 361time time 362tms times 363localtime localtime 364gmtime gmtime 365alarm alarm 366sleep sleep 1 367shmget shmget 368shmctl shmctl 369shmread shmread 370shmwrite shmwrite 371msgget msgget 372msgctl msgctl 373msgsnd msgsnd 374msgrcv msgrcv 375semget semget 376semctl semctl 377semop semop 378require use strict 379dofile do 'file' 380entereval eval "1+1" 381leaveeval eval "1+1" 382entertry SKIP eval { 1+1 } 383leavetry SKIP eval { 1+1 } 384ghbyname gethostbyname 'foo' 385ghbyaddr gethostbyaddr 'foo' 386ghostent gethostent 387gnbyname getnetbyname 'foo' 388gnbyaddr getnetbyaddr 'foo' 389gnetent getnetent 390gpbyname getprotobyname 'foo' 391gpbynumber getprotobynumber 42 392gprotoent getprotoent 393gsbyname getservbyname 'name', 'proto' 394gsbyport getservbyport 'a', 'b' 395gservent getservent 396shostent sethostent 397snetent setnetent 398sprotoent setprotoent 399sservent setservent 400ehostent endhostent 401enetent endnetent 402eprotoent endprotoent 403eservent endservent 404gpwnam getpwnam 405gpwuid getpwuid 406gpwent getpwent 407spwent setpwent 408epwent endpwent 409ggrnam getgrnam 410ggrgid getgrgid 411ggrent getgrent 412sgrent setgrent 413egrent endgrent 414getlogin getlogin 415syscall syscall 416lock SKIP 417threadsv SKIP 418setstate SKIP 419method_named $x->y() 420dor $x // $y 421dorassign $x //= $y 422once SKIP {use feature 'state'; state $foo = 42;} 423say SKIP {use feature 'say'; say "foo";} 424smartmatch $x ~~ $y 425aeach SKIP each @t 426akeys SKIP keys @t 427avalues SKIP values @t 428custom SKIP (no way) 429