Files
typewriter/firmware/Cargo.toml
Julien Calixte 8edd3badfc fix(usb-kbd): quiesce in-flight transfer before free; guard hot-plug leaks
Adopt the keymap crate (drops the PREV_KEYS/CAPS_USED statics for one
owned Decoder) and harden device teardown:

- #1 UAF: track REPORT_INFLIGHT (set on submit, cleared first thing in
  report_cb). Teardown moves to close_device, which pumps client events
  until the transfer quiesces before freeing it, and leaks rather than
  frees if it never does — a leak is recoverable, a use-after-free is
  not. usb_host_transfer_free's return is now checked.
- #3 leaks: a new attach while a device is still open tears the old one
  down first; control_request and start_report_polling free the transfer
  they allocated on a submit error.

Decode correctness is covered by the keymap tests; the teardown paths
are FFI and still need an on-device hot-plug run to confirm.
2026-07-10 10:36:47 +01:00

102 lines
3.7 KiB
TOML

[package]
name = "firmware"
version = "0.1.0"
authors = ["Julien Calixte <juliencalixte@gmail.com>"]
edition = "2024"
resolver = "2"
rust-version = "1.85"
# Declare every binary explicitly so a spike program under src/bin/ doesn't get
# an auto-discovered target with the default test harness (which trips up
# rust-analyzer — see README "harness = false" note).
autobins = false
[[bin]]
name = "firmware"
path = "src/main.rs"
harness = false # do not use the built-in cargo test harness -> resolve rust-analyzer errors
# Spike 6 — Wi-Fi + TLS. Standalone bench program, kept separate from the
# editor firmware. Flash with `just flash-wifi`.
[[bin]]
name = "wifi_tls"
path = "src/bin/wifi_tls.rs"
harness = false
# Spike 3 — SD card (FAT) over the shared SPI2 bus. Standalone bench program.
# Flash with `just flash-sd`.
[[bin]]
name = "sd_fat"
path = "src/bin/sd_fat.rs"
harness = false
# Spike 7 Path 2 — libgit2 link/run smoke via the git2 safe API. Gated behind
# the `git` feature so the editor build never pulls libgit2-sys/pkg-config.
# Build: cargo build --release --bin git_smoke --features git (env in justfile).
[[bin]]
name = "git_smoke"
path = "src/bin/git_smoke.rs"
harness = false
required-features = ["git"]
# Spike 7 Path 2 finish — on-device init/commit/push over mbedTLS HTTPS. Wi-Fi +
# SNTP + flash-FAT + libgit2 in one bench binary. Gated behind `git` like
# git_smoke. Build/flash with `just flash-git-push` (needs the git TW_* vars in
# .env; flashes partitions.csv so the `storage` FAT partition exists).
[[bin]]
name = "git_push"
path = "src/bin/git_push.rs"
harness = false
required-features = ["git"]
# Milestone #2A — persistent-clone publish cycle (clone + open + fast-forward
# push), the product's real git flow. Same `git` gate + TW_* env + partition
# table as git_push. Build/flash with `just flash-git-sync`.
[[bin]]
name = "git_sync"
path = "src/bin/git_sync.rs"
harness = false
required-features = ["git"]
[profile.release]
opt-level = "s"
[profile.dev]
debug = true # Symbols are nice, and they don't increase the size on Flash
opt-level = "z"
[patch.crates-io]
esp-idf-sys = { git = "https://github.com/esp-rs/esp-idf-sys.git" }
esp-idf-hal = { git = "https://github.com/esp-rs/esp-idf-hal.git" }
esp-idf-svc = { git = "https://github.com/esp-rs/esp-idf-svc.git" }
[features]
# Pulls the git2 safe API. libgit2 itself is built by the esp-idf component
# (firmware/components/libgit2/) with mbedTLS; git2/libgit2-sys are used in
# system mode (LIBGIT2_NO_VENDOR=1) purely for the Rust bindings, so we disable
# their default features to avoid dragging in openssl-sys/libssh2-sys.
git = ["dep:git2"]
[dependencies]
anyhow = "1"
log = "0.4"
# Pure HID decode (Key type + edge-detecting Decoder), split out so it is
# host-testable off the xtensa target. See ../keymap and MEMORY_AUDIT.md.
keymap = { path = "../keymap" }
git2 = { version = "0.20", default-features = false, optional = true }
esp-idf-svc = { version = "0.52.1", features = ["critical-section", "embassy-time-driver", "embassy-sync"] }
# Remove `generic-queue-8` if you plan to use `embassy-time` WITH `embassy-executor`
embassy-time = { version = "0.5", features = ["generic-queue-8"] }
embedded-graphics = "0.8"
# Traits shared with esp-idf-svc (Spike 6 uses `embedded_svc::http::Method`).
# Already in the tree via esp-idf-svc; pinned here so the spike names it directly.
embedded-svc = "0.29"
[build-dependencies]
embuild = "0.33"
# TEMPORARY — Spike 7 Path 2 Gate A probe. Builds libgit2 as an esp-idf
# component (see firmware/components/libgit2/). Compiled against on-disk source
# via LIBGIT2_SRC. Revert if the probe fails; promote (vendor the source) if it
# passes.
[[package.metadata.esp-idf-sys.extra_components]]
component_dirs = ["components/libgit2"]