You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Workflow corpus replay now classifies timeout/kill exits (124/137/143)
distinctly from generic crashes in both log and FAILED_TARGETS, and
captures the exit code in the non-empty-corpus branch like the empty
branch does.
- Defer src/version.h lookup in seed_corpus_from_chain.py until a stream
version prefix is actually needed; --help no longer requires an in-tree
checkout. Add --stream-version CLI flag and DASH_FUZZ_STREAM_VERSION
env override.
- Correct synthetic LLMQ seeds to match C++ serialization:
CRecoveredSig now includes msgHash; CSigSesAnn uses VARINT(sessionId)
+ llmqType + quorumHash + id + msgHash; CSigShare adds quorumMember
and 96-byte sigShare; CDKGComplaint includes a full 96-byte BLS
signature after both DYNBITSETs. Self-checks assert the corrected
byte sizes.
- Replace stale TODO above the MNAUTH skip in process_message.cpp with
a pointer to process_message_dash, which already exercises the
Dash-aware MNAUTH setup.
- Add src/test/fuzz/util_dash.h to non-backported.txt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Allowlist of Dash-specific fuzz targets (names beginning with "dash_") that are
155
+
# permitted to run as smoke-only when no corpus is present. Keep this list small
156
+
# and documented: every entry is a target we have explicitly decided cannot have
157
+
# a meaningful corpus yet (e.g. trivially-stateless harnesses). Adding a Dash
158
+
# target here MUST be justified in review — the default for new dash_* targets
159
+
# is to fail when the corpus is missing so they do not silently degrade to a
160
+
# 10-second smoke run that produces no signal.
161
+
DASH_SMOKE_ONLY_ALLOWLIST=""
162
+
163
+
is_dash_smoke_allowed() {
164
+
local t="$1"
165
+
for allowed in $DASH_SMOKE_ONLY_ALLOWLIST; do
166
+
[ "$t" = "$allowed" ] && return 0
167
+
done
168
+
return 1
169
+
}
170
+
155
171
while IFS= read -r target; do
156
172
[ -z "$target" ] && continue
157
173
corpus_dir="/tmp/fuzz_corpus/${target}"
158
174
artifact_prefix="${ARTIFACT_DIR}/${target}-"
159
175
176
+
# Classify a non-zero exit code from `timeout`/libFuzzer. timeout(1) reports
177
+
# 124 when the time budget elapsed, and 128+SIGNAL when the child was killed
178
+
# (137 = SIGKILL, 143 = SIGTERM). Treat those as "timeout/kill" and any other
179
+
# non-zero status as a generic crash. Both still fail the job.
180
+
classify_exit() {
181
+
case "$1" in
182
+
124|137|143) echo "timeout" ;;
183
+
*) echo "crash" ;;
184
+
esac
185
+
}
186
+
160
187
if [ ! -d "$corpus_dir" ] || [ -z "$(ls -A "$corpus_dir" 2>/dev/null)" ]; then
188
+
# Dash-specific targets (names beginning "dash_") MUST have corpus inputs from
189
+
# either the pinned dashpay/qa-assets layer or the synthetic seeder. Falling
190
+
# back to a 10-second empty-corpus smoke run produces no real signal and was
191
+
# masking missing-corpus regressions for newly added Dash harnesses. Inherited
192
+
# upstream/non-Dash targets are still allowed the smoke fallback so we do not
193
+
# regress on bitcoin-core targets that legitimately ship without a corpus.
194
+
case "$target" in
195
+
dash_*)
196
+
if ! is_dash_smoke_allowed "$target"; then
197
+
echo "::error::FAIL: $target has no corpus inputs in /tmp/fuzz_corpus/${target} — Dash-specific targets must ship with corpus data (qa-assets or synthetic seeder); refusing to silently smoke-test"
0 commit comments