1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
#!/bin/sh -efu
#
# Check decoding of prctl ops using syscall injection.
#
# Expects a binary that accepts PRCTL_INJECT_START as the first argument.
# Accepts list of retvals to inject as first PRCTL_INJECT_RETVALS= argument
#
# Copyright (c) 2018-2022 The strace developers.
# All rights reserved.
#
# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/scno_tampering.sh"
: "${PRCTL_INJECT_START=256}"
: "${PRCTL_INJECT_RETVALS=42}"
: "${PRCTL_SYSCALL=prctl}"
: "${PRCTL_MARKER_RE='prctl(0xffffffff\( \/\* PR_??? \*\/\)\?, 0xfffffffe, 0xfffffffd, 0xfffffffc, 0xfffffffb)'}"
check_prog sed
# We avoid messing with arguments by accepting arguments we understand only
# at the beginning of the argument list.
while [ "$#" -gt 0 ]; do
case "$1" in
ARCH_PRCTL_INJECT_RETVALS=*)
PRCTL_INJECT_RETVALS="${1#ARCH_PRCTL_INJECT_RETVALS=}"
PRCTL_SYSCALL=arch_prctl
PRCTL_MARKER_RE='arch_prctl(0xffffffff\( \/\* ARCH_??? \*\/\)\?, 0xfffffffe)'
;;
PRCTL_INJECT_RETVALS=*)
PRCTL_INJECT_RETVALS="${1#PRCTL_INJECT_RETVALS=}"
PRCTL_SYSCALL=prctl
PRCTL_MARKER_RE='prctl(0xffffffff\( \/\* PR_??? \*\/\)\?, 0xfffffffe, 0xfffffffd, 0xfffffffc, 0xfffffffb)'
;;
*) break; ;;
esac
shift
done
"../$NAME" > /dev/null || {
rc=$?
case "$rc" in
1) ;; # expected
77) skip_ "../$NAME exited with code $rc" ;;
*) fail_ "../$NAME failed with code $rc" ;;
esac
}
for i in $(echo "$PRCTL_INJECT_RETVALS"); do
if [ "x${i}" = "x${i#error=}" ]; then
inj_str="retval=$((i))"
ret_val="${i}"
sed_match="$((i))"
else
inj_str="${i}"
ret_val="-1"
sed_match="-1 ${i#error=}"
fi
run_strace -a80 "$@" -e trace="${PRCTL_SYSCALL}" \
-e inject="${PRCTL_SYSCALL}":"${inj_str}":when="${PRCTL_INJECT_START}+" \
"../$NAME" "${PRCTL_INJECT_START}" "${ret_val}" > "$EXP.$i"
sed '0,/^'"${PRCTL_MARKER_RE}"' *= '"${sed_match}"' /d' < "$LOG" > "$OUT.$i"
match_diff "$OUT.$i" "$EXP.$i"
done
|