Skip to content

Undocumented capacity limit for HeaderMap #603

Closed

Description

@jongiddy

HeaderMap has a capacity limit of 24576 headers. Adding any more headers triggers a panic when reserving more capacity.

I can't see any way to prevent the panic when handling incoming headers, except to hard-wire a check for this value into calling code.

It would be useful to expose this value as a public constant.

At the very least it should be documented. Currently HeaderMap::reserve says "Panics if the new allocation size overflows usize." This should be "Panics if the new allocation size is greater than 24576."

Activity

  1. seanmonstar commented on Apr 28, 2023

    @seanmonstar
    Member

    Good catch, thanks for reporting this! I'd propose a few improvements:

    • Add a section to the struct docs about the max capacity. Since there are a few methods that would allocate more space, seems better to have a single place to refer to the limit.
    • Update reserve to say "panicks if the new size is larger than the internal max. See struct docs for more."
    • Optional: Add a try_reserve method. This changes the task from a docs fix to a feature request, so perhaps that should be a separate ticket if anyone wants this method.
  2. added
    E-easyEffort: easy. Start here :D
    A-headersArea: HTTP headers
    S-docsSeverity: docs. Explain things better.
    on Apr 28, 2023
  3. DDtKey commented on Jul 18, 2023

    @DDtKey

    I believe the correct way to fix that is to introduce fallible try_append method.
    It's too fragile to rely on reservation methods & documentation only and easy to miss the handling.

    It's clearly vulnerability right now, because all usages like this one will cause a panic

    cc @seanmonstar

  4. seanmonstar commented on Jul 18, 2023

    @seanmonstar
    Member

    Yea, I think the three bullet points I listed above would be a great addition. Want to submit a PR?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-headersArea: HTTP headersE-easyEffort: easy. Start here :DS-docsSeverity: docs. Explain things better.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions