-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpy-afl-tmin-crashes.sh
executable file
·62 lines (53 loc) · 1.83 KB
/
py-afl-tmin-crashes.sh
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
#!/usr/bin/env bash
set -euo pipefail
TARGET=$1
PYTHON_CMD=${PYTHON_CMD:-python3}
TARGET_SCRIPT=$TARGET/fuzz.py
if ! [[ -f "$TARGET_SCRIPT" ]]; then
echo >&2 "Fuzz target $TARGET/fuzz.py does not exist!"
exit 1
fi
workdir=$(mktemp -d)
function cleanup()
{
rm -rf "$workdir"
}
trap cleanup EXIT
crashes=$(find "$TARGET"/crashes-raw/ -type f -name '*.in')
while read -r filename; do
if [[ -z "$filename" ]]; then
break
fi
BASE=$(basename "$filename" .in)
mkdir -p "$TARGET"/crashes
OUTNAME=$TARGET/crashes/$BASE.in
if [[ -e "$OUTNAME" ]]; then
continue
fi
# Handle zero-sized files:
if [[ ! -s "$filename" ]]; then
continue
fi
py-afl-tmin -m 200 -i "$filename" -o "$workdir"/tmin -- \
"$PYTHON_CMD" "$TARGET_SCRIPT" @@
(ulimit -v 200000; "$PYTHON_CMD" "$TARGET_SCRIPT" "$workdir"/tmin 1>/dev/null 2>"$workdir"/backtrace) || :
./normalize-backtrace.py < "$workdir"/backtrace > "$workdir"/backtrace.normalized
read -r stack_trace_sum _ <<< "$(sha256sum -b "$workdir"/backtrace.normalized)"
# After tmin operation, multiple different stack backtraces can
# actually be just different instances of the same
# problem. Symbolically link to indicate the duplicates.
if [[ -e "$TARGET/crashes/$stack_trace_sum.in" ]]; then
ln -s "$stack_trace_sum.in" "$OUTNAME"
size_old=$(stat --format=%s "$OUTNAME")
size_new=$(stat --format=%s "$workdir"/tmin)
if [[ "$size_new" -lt "$size_old" ]]; then
cp "$workdir"/tmin "$OUTNAME"
fi
continue
fi
cp "$workdir"/tmin "$TARGET/crashes/$stack_trace_sum.in"
cp "$workdir"/backtrace.normalized "$TARGET/crashes/backtrace.$stack_trace_sum.txt"
if [[ ! -e "$OUTNAME" ]]; then
ln -s "$stack_trace_sum.in" "$OUTNAME"
fi
done <<< "$crashes"