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