Skip to content

v1.12.0

Choose a tag to compare

@polius polius released this 11 Sep 18:31
· 40 commits to main since this release
195d141

Security & correctness

  • Truncated transfers are no longer accepted as success. A malicious sender could declare one size and then send fewer bytes — the receiver used to save the partial file and report success. It now fails with a clear error and discards the partial. Caught by a new hostile-peer test.

  • Tighter memory limits on hostile input. A single 40-byte chunk header made the receiver pre-allocate up to 65535 segment slots (~3 MiB). Memory now grows with the bytes actually received.

  • LAN discovery hardening. Multicast sockets no longer leak on startup failures; spoofed mDNS answers pointing the receiver at an arbitrary host are dropped; and fsend announces only real LAN hardware — never VPN or Docker addresses.

Reliability

  • Same-network discovery now just works. Finding a sender on the same Wi-Fi used to be a coin flip: it succeeded 30–70% of the time, occasionally hung, and transfers quietly fell back to the pairing server. The causes were a library bug that could stall a discovery query forever, and macOS's Local Network privacy blocking multicast on the Wi-Fi interface. Discovery now tries this machine first (instant), then the LAN on a separate socket, skipping virtual interfaces — and reports honestly when the OS blocks it. Measured: 10/10 successes at ~2 ms.

Verification & UX

  • SHA-256 verification. The receiver prints the SHA-256 of what it saved — compare it against shasum -a 256 on the sender. Resumed transfers hash the whole file. --manifest gains a sha256 column.

  • New fsend doctor. One command checks everything a transfer depends on: server reachability, the LAN address fsend would use, and a live mDNS roundtrip. Always exits 0, and explains any degradation — e.g. if macOS blocked multicast, it says other-device discovery falls back to the pairing server.

  • Route chip. The progress bar shows where the bytes are going: LAN / direct / relay.

  • Completion notification. A bell + desktop notification when a transfer finishes; off with --quiet.

Dependencies

  • Updated the network stack (pion mdns/ice/dtls/turn, including the stun v4 migration) and the golang.org/x libraries.

Upgrading

  • CLI: fsend --update (or brew upgrade fsend). No flag or config changes.
  • Self-hosted: no configuration changes; update the server alongside the clients to pick up the same dependency fixes.

Changelog

  • fix(e2e): pick the relay's UDP port with a UDP bind, not a TCP one (#180) (@polius)
  • fix: revision security findings, deterministic LAN discovery, verification UX (#207) (@polius)