|  | #!/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 |