#!/bin/sh -efu # # Check that fault injection works properly. # # Copyright (c) 2016 Dmitry V. Levin # 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