Skip to content

Stable Release

Choose a tag to compare

@gafferongames gafferongames released this 10 Jul 02:13
3c352e7

Major release: build system migration, extensive security hardening, and disconnect diagnostics.

Build and CI

  • Build system migrated from premake to CMake (3.16+). cmake -B build && cmake --build build -j, executables in bin/. See BUILDING.md.
  • Full CI: Linux/macOS/Windows debug + release, ASan+UBSan+LSan, MemorySanitizer, bounded fuzzing and a sanitized soak on every PR, plus a nightly extended-fuzzing workflow with a persistent corpus.

Security hardening

  • The vendored libsodium is pruned to the used subset, aligned to upstream 1.0.20, and amalgamated into a single header/source pair, with AEAD known-answer tests.
  • Five libFuzzer targets cover every untrusted parser, including stateful and structure-aware targets over the connection deserializer. Fuzzing found and fixed: a remote heap overflow in block reassembly, a ChannelPacketData union misread, an uninitialized read of block.messageType, debug-build asserts reachable from the wire, allocation-failure crashes, a network-simulator packet leak, a block fragment-count overflow, and undefined behavior from unaligned bit-reader reads. Regression tests cover each.
  • New SECURITY.md with private vulnerability reporting.

New features

  • Client/server configuration is validated at startup in debug builds: invalid configs fail loudly with the field name and required value, and compile away entirely in release.
  • The server tracks why each client slot was last disconnected: Server::GetClientDisconnectReason(clientIndex) distinguishes kicked, clean disconnect, timed out (via netcode v1.3.2), and specific connection errors (serialize failure, desync, out of memory, …), recorded before OnServerClientDisconnected fires.
  • The client reports why it ended up disconnected: Client::GetDisconnectReason() preserves the detailed netcode failure states — connection denied (server full), connect token expired/invalid, request/response/connection timed out, disconnected by server — so games can tell the player what actually happened.
  • Insecure connect tokens now use a longer expiry than their timeout, so a failed insecure connect reports "connection request timed out" like a matcher token would.

Vendored libraries

  • serialize v1.3.1, reliable v1.3.0, netcode v1.3.2.

Documentation

  • USAGE.md: message ownership rules, disconnect reason handling, config validation. README: design assumptions (single-threaded, ~100 players or less, identical client/server config). CONTRIBUTING.md added; BUILDING.md covers CMake and Windows header notes.

Validated with the full CI matrix plus a 5.5-million-iteration soak under AddressSanitizer and UndefinedBehaviorSanitizer at high packet loss, run clean before tagging.

What's Changed

Full Changelog: v1.4.0...v1.5.0