Files
rustfs/deny.toml
T
Zhengchao An 0f83a27f6a fix(deps): pin hyper to flush-before-shutdown fix for large-GET unexpected EOF (#4797)
* fix(deps): pin hyper to flush-before-shutdown fix for large-GET unexpected EOF

hyper <= 1.10.1 can call poll_shutdown() on an HTTP/1 socket while response
bytes are still buffered (a prior poll_flush() returned Poll::Pending and the
result was discarded), so a backpressured/slow-reading peer receives a graceful
FIN before the full Content-Length body is flushed. Standard S3 clients
(minio-go/warp) report this as sporadic `unexpected EOF` on large-object GET
under load (rustfs/backlog#1232). This is the transport-layer bug from
Cloudflare's "hyper-bug" writeup — distinct from the EC-reconstruct-desync EOF
already fixed via lockstep decode; here the app layer delivers the full body and
truncation is purely hyper->socket.

Fixed upstream in hyperium/hyper#4018 (commit 72046cc7, "fix(http1): flush
buffered data before shutdown"), which is not in any crates.io release yet as of
hyper 1.10.1. Pin hyper via [patch.crates-io] to git rev ccc1e850 (a descendant
of the fix that still declares version 1.10.1).

Use [patch.crates-io], not a git+rev on the workspace `hyper` dependency: the
server connection is driven by the transitive hyper-util (conn::auto /
GracefulShutdown), and a git source would not unify with the crates.io hyper
hyper-util resolves, leaving two hyper copies with the server path still on the
buggy one. The patch rewrites the crates.io source globally, so the lockfile
holds a single git-sourced hyper.

Add rustfs/tests/hyper_h1_shutdown_flush_regression.rs, a deterministic guard
(mirrors hyper's own h1_shutdown_while_buffered) that fails if the pin is dropped
or hyper is downgraded below the fix. Its load-bearing assertion is a
synchronously-set flag, so a slow runner can only under-detect, never false-red.

Closes rustfs/backlog#1232.

* build(deny): allow the hyperium/hyper git source for the flush-before-shutdown pin

cargo-deny's [sources] check denies unknown git sources. The hyper
[patch.crates-io] pin added for rustfs/backlog#1232 uses a github.com/hyperium
git source, so add it to allow-git with an owner/review note and a removal
condition (drop once a released hyper > 1.10.1 carries commit 72046cc7).
2026-07-13 15:36:38 +00:00

103 lines
3.9 KiB
TOML

# cargo-deny configuration
#
# Run with `cargo deny check` (advisories, sources, bans, licenses).
# Schema: https://embarkstudios.github.io/cargo-deny/checks/cfg.html
#
# This file codifies what was previously implicit policy:
# - which RustSec advisories we knowingly accept and why,
# - which non-crates.io sources we trust,
# - which duplicate crate versions we tolerate vs. flag.
#
# When adding an exception, include an `# owner: <github-handle> review: <yyyy-mm>`
# comment so future audits know who signed off and when to revisit.
[graph]
all-features = true
no-default-features = false
[advisories]
version = 2
yanked = "deny"
ignore = [
# `paste 1.0.15` — unmaintained. No direct dependency.
# owner: rustfs-maintainers review: 2026-07
{ id = "RUSTSEC-2024-0436", reason = "paste unmaintained; transitive only; tracked for upgrade" },
# `rsa` Marvin timing sidechannel (RUSTSEC-2023-0071). Pulled in via
# `openidconnect` (transitive) and historically used directly. No upstream
# fix is available yet. Tracked separately for follow-up; remove this
# entry once a patched `rsa` lands in the dependency graph and any
# in-process RSA decryption oracles are removed.
# owner: rustfs-maintainers review: 2026-07
{ id = "RUSTSEC-2023-0071", reason = "rsa Marvin timing sidechannel; no fixed upstream version; tracked separately" },
]
[sources]
unknown-registry = "deny"
unknown-git = "deny"
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
allow-git = [
# Custom S3 server library with minio compatibility patches not yet upstreamed.
# Pinned to a specific commit in workspace Cargo.toml.
# "https://github.com/rustfs/s3s",
"https://github.com/apache/datafusion.git",
# hyper pinned (via [patch.crates-io]) to a rev carrying the HTTP/1
# flush-before-shutdown fix (hyperium/hyper#4018, commit 72046cc7) that is
# not yet in a crates.io release. Fixes sporadic large-GET `unexpected EOF`
# (rustfs/backlog#1232). Remove once a released hyper > 1.10.1 contains it.
# owner: rustfs-maintainers review: 2026-07
"https://github.com/hyperium/hyper.git",
]
[bans]
# Multiple-versions of the same crate are permitted with a warning so the
# graph remains buildable while we work the chains down. Crypto- and
# transport-sensitive crates are tracked separately below.
multiple-versions = "warn"
wildcards = "warn"
highlight = "all"
# Any future crate we want to forbid outright belongs here.
deny = []
# Crates whose duplicate versions are most worth eliminating, because they
# touch crypto, parsing, or networking trust boundaries. Not currently a
# build error — the graph still has duplicates — but tracking the list keeps
# them visible.
[[bans.skip-tree]]
# `windows-sys` notoriously has many old versions in dependency closures;
# don't flood the report with it.
name = "windows-sys"
[licenses]
version = 2
allow = [
"Apache-2.0",
"Apache-2.0 WITH LLVM-exception",
"BSD-2-Clause",
"BSD-3-Clause",
"BSL-1.0", # boost; tracing-related crates
"CC0-1.0",
"CDLA-Permissive-2.0", # webpki / linux-raw-sys metadata
"ISC",
"MIT",
"MIT-0",
"MPL-2.0",
"Unicode-3.0",
"Zlib",
]
confidence-threshold = 0.93
exceptions = [
# `ring` ships a custom license combining ISC, MIT, and an OpenSSL-style
# notice that does not parse cleanly as SPDX OpenSSL.
{ allow = ["ISC", "MIT"], crate = "ring" },
# `inferno` is CDDL-1.0 (copyleft). Used only by profiling tooling
# (pyroscope / jemalloc_pprof) which is opt-in and never linked into the
# default S3 path. Tracked as an exception rather than a blanket allow.
# owner: rustfs-maintainers review: 2026-07
{ allow = ["CDDL-1.0"], crate = "inferno" },
# `libbz2-rs-sys` carries the upstream bzip2-1.0.6 license. It's used
# transitively via `bzip2`. Not on a hot path.
# owner: rustfs-maintainers review: 2026-07
{ allow = ["bzip2-1.0.6"], crate = "libbz2-rs-sys" },
]