Files

88 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
#
# Shared setup for the util/check-*.sh syscall verification scripts
# (check-safe-traversal.sh, check-toctou.sh, check-libc-interposition.sh).
#
# Source it after setting CHECK_UTILS to the utilities the caller exercises:
#
# CHECK_UTILS="mkfifo touch head"
# . "$(dirname "${BASH_SOURCE[0]}")/check-common.sh"
#
# It provides $PROJECT_ROOT, a $TEMP_DIR cleaned up on exit, fail_immediately(),
# require_command(), and util_cmd()/have_util() to resolve a utility to a
# runnable command whether the tree was built as individual binaries or as the
# multicall binary.
: "${PROFILE:=release-small}"
export PROFILE
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BIN_DIR="$PROJECT_ROOT/target/$PROFILE"
TEMP_DIR=$(mktemp -d)
cleanup() {
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
fail_immediately() {
echo "❌ FAILED: $1"
# Only the strace-based checks leave logs behind; mention them if they exist.
if compgen -G "$TEMP_DIR/strace_*.log" >/dev/null; then
echo ""
echo "Debug information available in: $TEMP_DIR/strace_*.log"
fi
exit 1
}
require_command() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Error: $1 is required to run these checks"
exit 1
fi
}
# Prefer individual binaries: they are what CI builds, and tracing them avoids
# the multicall dispatch noise. Fall back to the multicall binary otherwise.
detect_binaries() {
local util
for util in $CHECK_UTILS; do
if [ -f "$BIN_DIR/$util" ]; then
echo "Using individual binaries"
USE_MULTICALL=0
return
fi
done
if [ -f "$BIN_DIR/coreutils" ]; then
echo "Using multicall binary"
USE_MULTICALL=1
COREUTILS_BIN="$BIN_DIR/coreutils"
MULTICALL_UTILS=$("$COREUTILS_BIN" --list)
return
fi
echo "Error: No binaries found. Please build first with 'cargo build --profile=$PROFILE'"
exit 1
}
# Resolve a utility to a runnable command, or return 1 when it was not built.
# A multicall binary built without the unix feature set has no chmod or chown
# in it, so ask it what it actually dispatches.
util_cmd() {
local util="$1"
if [ "$USE_MULTICALL" -eq 1 ]; then
grep -qx "$util" <<<"$MULTICALL_UTILS" || return 1
echo "$COREUTILS_BIN $util"
else
[ -f "$BIN_DIR/$util" ] || return 1
echo "$BIN_DIR/$util"
fi
}
have_util() {
util_cmd "$1" >/dev/null
}
detect_binaries