Security & correctness fixes
- Unbounded allocation from unauthenticated clients — packet, string, and RCON lengths are now bounds-checked (rejecting negative/oversized VarInts) before allocating, and handshake/status/login reads now time out (
handshake_timeout_secs, default 10s) instead of holding connections open indefinitely. - Lossy protocol re-encoding — the proxy now forwards the client's original handshake and Login Start packets byte-for-byte instead of reconstructing them, fixing broken support for protocol versions other than 1.20.2+ and no longer stripping modded (Forge/Fabric) handshake markers.
- Lifecycle races — a client that disconnects while the container is still booting no longer leaves it running forever with nothing scheduled to stop it. A failed idle-shutdown no longer reports the server as
Stoppedwhile it's actually still running. A login arriving while an idle shutdown is in progress now waits for it to resolve instead of being forwarded into a container that's mid-stop. A failed container start now notifies a waiting client immediately instead of after the full startup timeout.
Maintenance
anyhowbumped past RUSTSEC-2026-0190; unusedthiserrordependency removed;tokiofeatures narrowed to only what's used.- Declared and CI-enforced MSRV: Rust 1.88+.
Docker
ghcr.io/samuelloranger/redoxide:v0.3.0
ghcr.io/samuelloranger/redoxide:0.3
ghcr.io/samuelloranger/redoxide:latest