Skip to content

Commit 29e6e6f

Browse files
chore[fuzz]: minimize fuzzing corpora (#6334)
Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
1 parent 66eef47 commit 29e6e6f

2 files changed

Lines changed: 157 additions & 92 deletions

File tree

Lines changed: 49 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,62 @@
1-
name: Minimize Fuzz Corpus
1+
name: Minimize All Fuzz Corpora
22

33
concurrency:
4-
# The group causes runs to queue instead of running in parallel.
5-
group: minimize-corpus
6-
# This prevents one run from overwriting another's minimization work (no compare-and-swap used).
4+
group: fuzz
75
cancel-in-progress: false
86

97
on:
8+
schedule:
9+
- cron: "0 0 * * 0" # every Sunday at midnight UTC
1010
workflow_dispatch: { }
1111

1212
jobs:
13+
# ============================================================================
14+
# IO Fuzzer
15+
# ============================================================================
1316
io_fuzz_minimize:
1417
name: "Minimize IO Fuzz Corpus"
15-
runs-on:
16-
- runs-on=${{ github.run_id }}
17-
- family=m8g.2xlarge
18-
- image=ubuntu24-full-arm64
19-
- disk=large
20-
- extras=s3-cache
21-
- tag=io-fuzz-minimize
22-
steps:
23-
- uses: runs-on/action@v2
24-
with:
25-
sccache: s3
26-
- uses: actions/checkout@v6
27-
- uses: ./.github/actions/setup-rust
28-
with:
29-
repo-token: ${{ secrets.GITHUB_TOKEN }}
30-
toolchain: nightly
31-
- name: Install cargo fuzz
32-
run: cargo install --locked cargo-fuzz
33-
- name: Restore corpus
34-
shell: bash
35-
run: |
36-
aws s3 cp s3://vortex-fuzz-corpus/io_corpus.tar.zst .
37-
tar -xf io_corpus.tar.zst
38-
env:
39-
AWS_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
40-
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
41-
AWS_REGION: "us-east-1"
42-
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
43-
- name: Minimize corpus
44-
run: |
45-
mkdir -p fuzz/corpus/file_io_2
46-
cargo +nightly fuzz cmin file_io fuzz/corpus/file_io -- fuzz/corpus/file_io_2
47-
rm -rf fuzz/corpus/file_io
48-
mv fuzz/corpus/file_io_2 fuzz/corpus/file_io
49-
- name: Persist corpus
50-
shell: bash
51-
run: |
52-
tar -acf io_corpus.tar.zst fuzz/corpus/file_io
53-
aws s3api put-object --bucket vortex-fuzz-corpus --key "io_corpus.tar.zst" --body io_corpus.tar.zst --checksum-algorithm CRC32
54-
env:
55-
AWS_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
56-
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
57-
AWS_REGION: "us-east-1"
58-
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
18+
uses: ./.github/workflows/minimize_fuzz_corpus_workflow.yml
19+
with:
20+
fuzz_target: file_io
21+
secrets:
22+
R2_FUZZ_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
23+
R2_FUZZ_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
5924

25+
# ============================================================================
26+
# Array Operations Fuzzer
27+
# ============================================================================
6028
ops_fuzz_minimize:
6129
name: "Minimize Array Ops Fuzz Corpus"
62-
runs-on:
63-
- runs-on=${{ github.run_id }}
64-
- family=m8g.2xlarge
65-
- image=ubuntu24-full-arm64
66-
- disk=large
67-
- extras=s3-cache
68-
- tag=ops-fuzz-minimize
69-
steps:
70-
- uses: runs-on/action@v2
71-
with:
72-
sccache: s3
73-
- uses: actions/checkout@v6
74-
- uses: ./.github/actions/setup-rust
75-
with:
76-
repo-token: ${{ secrets.GITHUB_TOKEN }}
77-
toolchain: nightly
78-
- name: Install cargo fuzz
79-
run: cargo install --locked cargo-fuzz
80-
- name: Restore corpus
81-
shell: bash
82-
run: |
83-
aws s3 cp s3://vortex-fuzz-corpus/array_ops_corpus.tar.zst .
84-
tar -xf array_ops_corpus.tar.zst
85-
env:
86-
AWS_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
87-
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
88-
AWS_REGION: "us-east-1"
89-
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
90-
- name: Minimize corpus
91-
run: |
92-
mkdir -p fuzz/corpus/array_ops_2
93-
cargo +nightly fuzz cmin array_ops fuzz/corpus/array_ops -- fuzz/corpus/array_ops_2
94-
rm -rf fuzz/corpus/array_ops
95-
mv fuzz/corpus/array_ops_2 fuzz/corpus/array_ops
96-
- name: Persist corpus
97-
shell: bash
98-
run: |
99-
tar -acf array_ops_corpus.tar.zst fuzz/corpus/array_ops
100-
aws s3api put-object --bucket vortex-fuzz-corpus --key "array_ops_corpus.tar.zst" --body array_ops_corpus.tar.zst --checksum-algorithm CRC32
101-
env:
102-
AWS_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
103-
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
104-
AWS_REGION: "us-east-1"
105-
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
30+
uses: ./.github/workflows/minimize_fuzz_corpus_workflow.yml
31+
with:
32+
fuzz_target: array_ops
33+
secrets:
34+
R2_FUZZ_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
35+
R2_FUZZ_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
36+
37+
# ============================================================================
38+
# Compress Roundtrip Fuzzer
39+
# ============================================================================
40+
compress_fuzz_minimize:
41+
name: "Minimize Compress Roundtrip Fuzz Corpus"
42+
uses: ./.github/workflows/minimize_fuzz_corpus_workflow.yml
43+
with:
44+
fuzz_target: compress_roundtrip
45+
secrets:
46+
R2_FUZZ_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
47+
R2_FUZZ_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
48+
49+
# ============================================================================
50+
# GPU Compress Fuzzer (CUDA)
51+
# ============================================================================
52+
gpu_compress_fuzz_minimize:
53+
name: "Minimize GPU Compress Fuzz Corpus"
54+
uses: ./.github/workflows/minimize_fuzz_corpus_workflow.yml
55+
with:
56+
fuzz_target: compress_gpu
57+
family: "g4dn"
58+
image: "ubuntu24-gpu-x64"
59+
extra_features: "cuda"
60+
secrets:
61+
R2_FUZZ_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
62+
R2_FUZZ_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
name: Minimize Fuzz Corpus
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
fuzz_target:
7+
description: "The cargo fuzz target name (e.g., file_io, array_ops, compress_roundtrip)"
8+
required: true
9+
type: string
10+
family:
11+
description: "Runner family"
12+
required: false
13+
type: string
14+
default: "m8g.2xlarge"
15+
image:
16+
description: "Runner image"
17+
required: false
18+
type: string
19+
default: "ubuntu24-full-arm64"
20+
extra_features:
21+
description: "Extra cargo features to enable (e.g., cuda)"
22+
required: false
23+
type: string
24+
default: ""
25+
secrets:
26+
R2_FUZZ_ACCESS_KEY_ID:
27+
required: true
28+
R2_FUZZ_SECRET_ACCESS_KEY:
29+
required: true
30+
31+
jobs:
32+
minimize:
33+
name: "Minimize ${{ inputs.fuzz_target }}"
34+
runs-on:
35+
- runs-on=${{ github.run_id }}
36+
- family=${{ inputs.family }}
37+
- image=${{ inputs.image }}
38+
- disk=large
39+
- extras=s3-cache
40+
- tag=${{ inputs.fuzz_target }}-minimize
41+
steps:
42+
- name: Bail if not on develop
43+
if: github.ref != 'refs/heads/develop'
44+
run: |
45+
echo "::error::Corpus minimization should only run on the develop branch (current: ${{ github.ref }})"
46+
exit 1
47+
48+
- uses: runs-on/action@v2
49+
with:
50+
sccache: s3
51+
52+
- uses: actions/checkout@v6
53+
54+
- uses: ./.github/actions/setup-rust
55+
with:
56+
repo-token: ${{ secrets.GITHUB_TOKEN }}
57+
toolchain: nightly
58+
59+
- name: Install cargo fuzz
60+
run: cargo install --locked cargo-fuzz
61+
62+
- name: Restore corpus
63+
shell: bash
64+
env:
65+
AWS_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
66+
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
67+
AWS_REGION: "us-east-1"
68+
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
69+
run: |
70+
CORPUS_KEY="${{ inputs.fuzz_target }}_corpus.tar.zst"
71+
CORPUS_DIR="fuzz/corpus/${{ inputs.fuzz_target }}"
72+
73+
if aws s3 cp "s3://vortex-fuzz-corpus/$CORPUS_KEY" . 2>/dev/null; then
74+
echo "Downloaded corpus successfully"
75+
tar -xf "$CORPUS_KEY"
76+
else
77+
echo "No existing corpus found, nothing to minimize"
78+
mkdir -p "$CORPUS_DIR"
79+
exit 0
80+
fi
81+
82+
- name: Minimize corpus
83+
run: |
84+
FEATURES_FLAG=""
85+
if [ -n "${{ inputs.extra_features }}" ]; then
86+
FEATURES_FLAG="--features ${{ inputs.extra_features }}"
87+
fi
88+
CORPUS_DIR="fuzz/corpus/${{ inputs.fuzz_target }}"
89+
MINIMIZED_DIR="${CORPUS_DIR}_minimized"
90+
mkdir -p "$MINIMIZED_DIR"
91+
RUSTFLAGS="--cfg vortex_nightly" \
92+
cargo +nightly fuzz cmin $FEATURES_FLAG \
93+
${{ inputs.fuzz_target }} "$CORPUS_DIR" -- "$MINIMIZED_DIR"
94+
rm -rf "$CORPUS_DIR"
95+
mv "$MINIMIZED_DIR" "$CORPUS_DIR"
96+
97+
- name: Persist corpus
98+
shell: bash
99+
env:
100+
AWS_ACCESS_KEY_ID: ${{ secrets.R2_FUZZ_ACCESS_KEY_ID }}
101+
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_FUZZ_SECRET_ACCESS_KEY }}
102+
AWS_REGION: "us-east-1"
103+
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
104+
run: |
105+
CORPUS_KEY="${{ inputs.fuzz_target }}_corpus.tar.zst"
106+
CORPUS_DIR="fuzz/corpus/${{ inputs.fuzz_target }}"
107+
tar -acf "$CORPUS_KEY" "$CORPUS_DIR"
108+
aws s3api put-object --bucket vortex-fuzz-corpus --key "$CORPUS_KEY" --body "$CORPUS_KEY" --checksum-algorithm CRC32

0 commit comments

Comments
 (0)