118 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/sh -efu
 | |
| #
 | |
| # Check that fault injection works properly.
 | |
| #
 | |
| # Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
 | |
| # Copyright (c) 2016-2018 The strace developers.
 | |
| # All rights reserved.
 | |
| #
 | |
| # Redistribution and use in source and binary forms, with or without
 | |
| # modification, are permitted provided that the following conditions
 | |
| # are met:
 | |
| # 1. Redistributions of source code must retain the above copyright
 | |
| #    notice, this list of conditions and the following disclaimer.
 | |
| # 2. Redistributions in binary form must reproduce the above copyright
 | |
| #    notice, this list of conditions and the following disclaimer in the
 | |
| #    documentation and/or other materials provided with the distribution.
 | |
| # 3. The name of the author may not be used to endorse or promote products
 | |
| #    derived from this software without specific prior written permission.
 | |
| #
 | |
| # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 | |
| # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | |
| # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | |
| # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | |
| # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | |
| # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | |
| # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| 
 | |
| . "${srcdir=.}/scno_tampering.sh"
 | |
| 
 | |
| #
 | |
| # F
 | |
| # F+
 | |
| # F+S
 | |
| 
 | |
| N=100
 | |
| 
 | |
| : ${suffix=}
 | |
| [ -z "${name_override-}" ] || NAME="$name_override"
 | |
| 
 | |
| check_fault_injection()
 | |
| {
 | |
| 	local trace fault err first step procs extra
 | |
| 	trace=$1; shift
 | |
| 	fault=$1; shift
 | |
| 	err=$1; shift
 | |
| 	first=$1; shift
 | |
| 	step=$1; shift
 | |
| 	procs=$1; shift
 | |
| 	extra="$*"
 | |
| 
 | |
| 	local when=
 | |
| 	if [ -z "$first$step" ]; then
 | |
| 		first=1
 | |
| 		step=1
 | |
| 	else
 | |
| 		case "$step" in
 | |
| 			'') when=":when=$first"; step=0 ;;
 | |
| 			+) when=":when=$first+"; step=1 ;;
 | |
| 			*) when=":when=$first+$step" ;;
 | |
| 		esac
 | |
| 	fi
 | |
| 
 | |
| 	local error=
 | |
| 	local raw=reg
 | |
| 	set --
 | |
| 	case "$err" in
 | |
| 		'') ;;
 | |
| 		[123456789]*)
 | |
| 			error=":error=$err"
 | |
| 			raw=raw
 | |
| 			set -- -e raw=all
 | |
| 			;;
 | |
| 		*) error=":error=$err" ;;
 | |
| 	esac
 | |
| 
 | |
| 	outexp="$NAME.out.exp"
 | |
| 	outgot="$NAME.out.got"
 | |
| 	outout="$NAME.out.out"
 | |
| 	outpid="$NAME.pid"
 | |
| 
 | |
| 	run_strace -a11 -ff -e trace=$trace \
 | |
| 		"$@" -e fault=$fault$when$error$suffix $extra \
 | |
| 		../$NAME $raw "$err" "$first" "$step" $N \
 | |
| 		"$procs" "$outexp" "$outgot" "$outout" "$outpid"
 | |
| 
 | |
| 	for i in $(seq 0 $((procs - 1)) )
 | |
| 	do
 | |
| 		pid=$(cat "$outpid.$i")
 | |
| 
 | |
| 		match_diff "$LOG.$pid" "$outout.$i"
 | |
| 		match_diff "$outgot.$i" "$outexp.$i"
 | |
| 	done
 | |
| }
 | |
| 
 | |
| for err in '' ENOSYS 22 einval; do
 | |
| 	for fault in writev desc,51; do
 | |
| 		check_fault_injection \
 | |
| 			writev $fault "$err" '' '' 1 -efault=chdir
 | |
| 		check_fault_injection \
 | |
| 			writev $fault "$err" '' '' 1 -efault=chdir -efault=none
 | |
| 		for F in 1 2 3 5 7 11; do
 | |
| 			check_fault_injection \
 | |
| 				writev $fault "$err" $F '' 1
 | |
| 			check_fault_injection \
 | |
| 				writev $fault "$err" $F + 1
 | |
| 			for S in 1 2 3 5 7 11; do
 | |
| 				check_fault_injection \
 | |
| 					writev $fault "$err" $F $S 1
 | |
| 				check_fault_injection \
 | |
| 					writev $fault "$err" $F $S 4
 | |
| 			done
 | |
| 		done
 | |
| 	done
 | |
| done
 |