xref: /openbsd/gnu/usr.bin/perl/dist/Safe/t/safeops.t (revision 8932bfb7)
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