Skip to content

Bound the SSE reader's line buffer against unterminated input #10

Description

@OmarAlJarrah

Summary

ServerSentEventReader parses lines via StreamReader.ReadLineAsync, which buffers a single line without an upper bound. A server (or man-in-the-middle) sending one endless line with no terminator could grow the buffer until the client runs out of memory.

The SSE slice design (docs/superpowers/specs/2026-06-14-sse-slice-design.md §4) calls for "a bounded line buffer [to guard] against unterminated input"; the current implementation meets the parsing rules but not this bound.

Proposed direction

  • Add a configurable maximum line length (e.g. a default cap of ~1 MiB) to the reader / SseReconnectOptions.
  • When a single line exceeds the cap before a terminator is seen, fail with a clear StreamingException (or a dedicated SSE error) rather than buffering unboundedly.
  • A custom incremental line reader is likely needed since StreamReader.ReadLineAsync has no length cap.

Notes

  • Low severity for the common trusted-API-server case, but a genuine resilience/DoS hardening for untrusted or proxied streams.
  • BCL only; trim/AOT-safe.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions