Skip to content

resource: komide feed fetch has no time bound, can hang forever #549

Description

@forkwright

Finding

fetch_feed()/read_body_capped() (line 24 ff) enforce a byte cap but no time bound and use an externally-supplied reqwest::Client that archon constructs via Client::new() with no .timeout(), so a feed host that trickles bytes below the cap (or stalls after headers) blocks response.chunk().await forever, silently wedging that feed's poll task permanently with no logged error; KomideConfig.fetch_timeout_secs exists but is wired to nothing.

Evidence

crates/komide/src/fetch.rs:24. Surfaced by the 2026-07-03 deep-audit workflow (adversarially verified + Opus-judged).

Why this matters

A feed host that stalls after headers or trickles bytes below the size cap blocks that feed's poll task forever with no error logged, silently and permanently wedging that feed despite a configured (but unwired) timeout existing.

Desired correction

Build komide's client (or wrap each fetch) with the configured fetch_timeout_secs — either set .timeout() on the client or wrap the chunk-read loop in tokio::time::timeout — so a stalled feed fails and re-enters its backoff cycle.

Done when: the defect's failure mode no longer reproduces and a regression test covers it.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions