#!/bin/sh -efu # # Check that fault injection works properly. # # Copyright (c) 2016 Dmitry V. Levin # Copyright (c) 2016-2020 The strace developers. # All rights reserved. # # SPDX-License-Identifier: GPL-2.0-or-later . "${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 last step procs extra trace=$1; shift fault=$1; shift err=$1; shift first=$1; shift last=$1; shift step=$1; shift procs=$1; shift extra="$*" local when= if [ -z "$first$last$step" ]; then first=1 last=-1 step=1 elif [ -z "$last" ]; then case "$step" in '') when=":when=$first"; step=1; last=$first ;; +) when=":when=$first+"; step=1; last=-1 ;; *) when=":when=$first+$step"; last=-1; ;; esac else case "$step" in '') when=":when=${first}..${last}"; step=1 ;; +) when=":when=${first}..${last}+"; step=1 ;; *) when=":when=${first}..${last}+${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" "$last" "$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 L in 1 2 3 5 7 11; do [ "$L" -ge "$F" ] || continue check_fault_injection \ writev $fault "$err" $F $L '' 1 check_fault_injection \ writev $fault "$err" $F $L + 1 done 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 for L in 1 2 3 5 7 11; do [ "$L" -ge "$F" ] || continue check_fault_injection \ writev $fault "$err" $F $L $S 1 check_fault_injection \ writev $fault "$err" $F $L $S 4 done done done done done