xref: /aosp_15_r20/external/strace/tests-m32/qual_fault.test (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker#!/bin/sh -efu
2*cf84ac9aSAndroid Build Coastguard Worker#
3*cf84ac9aSAndroid Build Coastguard Worker# Check that fault injection works properly.
4*cf84ac9aSAndroid Build Coastguard Worker#
5*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2016 Dmitry V. Levin <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2016-2018 The strace developers.
7*cf84ac9aSAndroid Build Coastguard Worker# All rights reserved.
8*cf84ac9aSAndroid Build Coastguard Worker#
9*cf84ac9aSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
10*cf84ac9aSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions
11*cf84ac9aSAndroid Build Coastguard Worker# are met:
12*cf84ac9aSAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer.
14*cf84ac9aSAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright
15*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer in the
16*cf84ac9aSAndroid Build Coastguard Worker#    documentation and/or other materials provided with the distribution.
17*cf84ac9aSAndroid Build Coastguard Worker# 3. The name of the author may not be used to endorse or promote products
18*cf84ac9aSAndroid Build Coastguard Worker#    derived from this software without specific prior written permission.
19*cf84ac9aSAndroid Build Coastguard Worker#
20*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*cf84ac9aSAndroid Build Coastguard Worker# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*cf84ac9aSAndroid Build Coastguard Worker# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*cf84ac9aSAndroid Build Coastguard Worker# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*cf84ac9aSAndroid Build Coastguard Worker# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*cf84ac9aSAndroid Build Coastguard Worker# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*cf84ac9aSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*cf84ac9aSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*cf84ac9aSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*cf84ac9aSAndroid Build Coastguard Worker
31*cf84ac9aSAndroid Build Coastguard Worker. "${srcdir=.}/scno_tampering.sh"
32*cf84ac9aSAndroid Build Coastguard Worker
33*cf84ac9aSAndroid Build Coastguard Worker#
34*cf84ac9aSAndroid Build Coastguard Worker# F
35*cf84ac9aSAndroid Build Coastguard Worker# F+
36*cf84ac9aSAndroid Build Coastguard Worker# F+S
37*cf84ac9aSAndroid Build Coastguard Worker
38*cf84ac9aSAndroid Build Coastguard WorkerN=100
39*cf84ac9aSAndroid Build Coastguard Worker
40*cf84ac9aSAndroid Build Coastguard Worker: ${suffix=}
41*cf84ac9aSAndroid Build Coastguard Worker[ -z "${name_override-}" ] || NAME="$name_override"
42*cf84ac9aSAndroid Build Coastguard Worker
43*cf84ac9aSAndroid Build Coastguard Workercheck_fault_injection()
44*cf84ac9aSAndroid Build Coastguard Worker{
45*cf84ac9aSAndroid Build Coastguard Worker	local trace fault err first step procs extra
46*cf84ac9aSAndroid Build Coastguard Worker	trace=$1; shift
47*cf84ac9aSAndroid Build Coastguard Worker	fault=$1; shift
48*cf84ac9aSAndroid Build Coastguard Worker	err=$1; shift
49*cf84ac9aSAndroid Build Coastguard Worker	first=$1; shift
50*cf84ac9aSAndroid Build Coastguard Worker	step=$1; shift
51*cf84ac9aSAndroid Build Coastguard Worker	procs=$1; shift
52*cf84ac9aSAndroid Build Coastguard Worker	extra="$*"
53*cf84ac9aSAndroid Build Coastguard Worker
54*cf84ac9aSAndroid Build Coastguard Worker	local when=
55*cf84ac9aSAndroid Build Coastguard Worker	if [ -z "$first$step" ]; then
56*cf84ac9aSAndroid Build Coastguard Worker		first=1
57*cf84ac9aSAndroid Build Coastguard Worker		step=1
58*cf84ac9aSAndroid Build Coastguard Worker	else
59*cf84ac9aSAndroid Build Coastguard Worker		case "$step" in
60*cf84ac9aSAndroid Build Coastguard Worker			'') when=":when=$first"; step=0 ;;
61*cf84ac9aSAndroid Build Coastguard Worker			+) when=":when=$first+"; step=1 ;;
62*cf84ac9aSAndroid Build Coastguard Worker			*) when=":when=$first+$step" ;;
63*cf84ac9aSAndroid Build Coastguard Worker		esac
64*cf84ac9aSAndroid Build Coastguard Worker	fi
65*cf84ac9aSAndroid Build Coastguard Worker
66*cf84ac9aSAndroid Build Coastguard Worker	local error=
67*cf84ac9aSAndroid Build Coastguard Worker	local raw=reg
68*cf84ac9aSAndroid Build Coastguard Worker	set --
69*cf84ac9aSAndroid Build Coastguard Worker	case "$err" in
70*cf84ac9aSAndroid Build Coastguard Worker		'') ;;
71*cf84ac9aSAndroid Build Coastguard Worker		[123456789]*)
72*cf84ac9aSAndroid Build Coastguard Worker			error=":error=$err"
73*cf84ac9aSAndroid Build Coastguard Worker			raw=raw
74*cf84ac9aSAndroid Build Coastguard Worker			set -- -e raw=all
75*cf84ac9aSAndroid Build Coastguard Worker			;;
76*cf84ac9aSAndroid Build Coastguard Worker		*) error=":error=$err" ;;
77*cf84ac9aSAndroid Build Coastguard Worker	esac
78*cf84ac9aSAndroid Build Coastguard Worker
79*cf84ac9aSAndroid Build Coastguard Worker	outexp="$NAME.out.exp"
80*cf84ac9aSAndroid Build Coastguard Worker	outgot="$NAME.out.got"
81*cf84ac9aSAndroid Build Coastguard Worker	outout="$NAME.out.out"
82*cf84ac9aSAndroid Build Coastguard Worker	outpid="$NAME.pid"
83*cf84ac9aSAndroid Build Coastguard Worker
84*cf84ac9aSAndroid Build Coastguard Worker	run_strace -a11 -ff -e trace=$trace \
85*cf84ac9aSAndroid Build Coastguard Worker		"$@" -e fault=$fault$when$error$suffix $extra \
86*cf84ac9aSAndroid Build Coastguard Worker		../$NAME $raw "$err" "$first" "$step" $N \
87*cf84ac9aSAndroid Build Coastguard Worker		"$procs" "$outexp" "$outgot" "$outout" "$outpid"
88*cf84ac9aSAndroid Build Coastguard Worker
89*cf84ac9aSAndroid Build Coastguard Worker	for i in $(seq 0 $((procs - 1)) )
90*cf84ac9aSAndroid Build Coastguard Worker	do
91*cf84ac9aSAndroid Build Coastguard Worker		pid=$(cat "$outpid.$i")
92*cf84ac9aSAndroid Build Coastguard Worker
93*cf84ac9aSAndroid Build Coastguard Worker		match_diff "$LOG.$pid" "$outout.$i"
94*cf84ac9aSAndroid Build Coastguard Worker		match_diff "$outgot.$i" "$outexp.$i"
95*cf84ac9aSAndroid Build Coastguard Worker	done
96*cf84ac9aSAndroid Build Coastguard Worker}
97*cf84ac9aSAndroid Build Coastguard Worker
98*cf84ac9aSAndroid Build Coastguard Workerfor err in '' ENOSYS 22 einval; do
99*cf84ac9aSAndroid Build Coastguard Worker	for fault in writev desc,51; do
100*cf84ac9aSAndroid Build Coastguard Worker		check_fault_injection \
101*cf84ac9aSAndroid Build Coastguard Worker			writev $fault "$err" '' '' 1 -efault=chdir
102*cf84ac9aSAndroid Build Coastguard Worker		check_fault_injection \
103*cf84ac9aSAndroid Build Coastguard Worker			writev $fault "$err" '' '' 1 -efault=chdir -efault=none
104*cf84ac9aSAndroid Build Coastguard Worker		for F in 1 2 3 5 7 11; do
105*cf84ac9aSAndroid Build Coastguard Worker			check_fault_injection \
106*cf84ac9aSAndroid Build Coastguard Worker				writev $fault "$err" $F '' 1
107*cf84ac9aSAndroid Build Coastguard Worker			check_fault_injection \
108*cf84ac9aSAndroid Build Coastguard Worker				writev $fault "$err" $F + 1
109*cf84ac9aSAndroid Build Coastguard Worker			for S in 1 2 3 5 7 11; do
110*cf84ac9aSAndroid Build Coastguard Worker				check_fault_injection \
111*cf84ac9aSAndroid Build Coastguard Worker					writev $fault "$err" $F $S 1
112*cf84ac9aSAndroid Build Coastguard Worker				check_fault_injection \
113*cf84ac9aSAndroid Build Coastguard Worker					writev $fault "$err" $F $S 4
114*cf84ac9aSAndroid Build Coastguard Worker			done
115*cf84ac9aSAndroid Build Coastguard Worker		done
116*cf84ac9aSAndroid Build Coastguard Worker	done
117*cf84ac9aSAndroid Build Coastguard Workerdone
118