Skip to content

fix: remove Content-Length dependency in binary form deserialization#15796

Merged
elliott-with-the-longest-name-on-github merged 1 commit into
sveltejs:mainfrom
21RISK:fix-binary-form-deserialization-wihtout-content-length
May 22, 2026
Merged

fix: remove Content-Length dependency in binary form deserialization#15796
elliott-with-the-longest-name-on-github merged 1 commit into
sveltejs:mainfrom
21RISK:fix-binary-form-deserialization-wihtout-content-length

Conversation

@alexbjorlig

@alexbjorlig alexbjorlig commented May 4, 2026

Copy link
Copy Markdown
Contributor

closes #15299
closes #15783

This PR removes the reliance on the Content-Length header in deserialize_binary_form. Proxies and middleboxes (such as Vercel, Azure) may strip the Content-Length header and use chunked transfer encoding instead, which caused the deserialization to throw "invalid Content-Length header".

The fix uses the embedded binary header fields (data_length, file_offsets_length) for validation instead of trusting Content-Length, which can be missing or corrupted by intermediaries.

Changes:

  • Removed Content-Length parsing and validation in deserialize_binary_form
  • Removed three overflow checks that compared against content_length ("data overflow", "file offset table overflow", "file data overflow")
  • Added tests verifying deserialization works both with and without the Content-Length header

Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.

Tests

  • Run the tests with pnpm test and lint the project with pnpm lint and pnpm check

Changesets

  • If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running pnpm changeset and following the prompts. Changesets that add features should be minor and those that fix bugs should be patch. Please prefix changeset messages with feat:, fix:, or chore:.

Edits

  • Please ensure that 'Allow edits from maintainers' is checked. PRs without this option may be closed.

Co-authored-by: Copilot <copilot@github.com>
@changeset-bot

changeset-bot Bot commented May 4, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a02df9a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@ottomated

Copy link
Copy Markdown
Contributor

LGTM

@elliott-with-the-longest-name-on-github

Copy link
Copy Markdown
Contributor

This looks good at first glance, but I need to spend some additional time with it. It's coming very close to the code that solves several published GH Security Advisories / CVEs, and I think it's removing/modifying several of the regression tests for them. I need to make sure we're not opening ourselves up to amplification attacks here.

@ottomated

Copy link
Copy Markdown
Contributor

@elliott-with-the-longest-name-on-github not sure on the tests, but the content-length was always a sanity check (easily spoofable), so removing it if it's causing bugs won't be a problem

@elliott-with-the-longest-name-on-github elliott-with-the-longest-name-on-github merged commit 95ca921 into sveltejs:main May 22, 2026
26 checks passed
@github-actions github-actions Bot mentioned this pull request May 22, 2026
Rich-Harris pushed a commit that referenced this pull request May 22, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @sveltejs/kit@2.61.0

### Minor Changes

- breaking: the `.run()` method has been removed from remote queries on
both the client and the server. Use `await query()` directly instead —
it now works everywhere
([#15779](#15779))


- feat: remote queries can now be awaited in any context (event
handlers, module scope, async callbacks), not just inside reactive
contexts. The cache is shared across reactive and non-reactive
subscribers, so awaiting a query in an event handler will dedupe with
components that have already subscribed to the same query.
([#15779](#15779))


- feat: live query instances are now themselves async-iterable
([#15878](#15878))


- feat: add programmatic `submit` method to `form` remote function
instances ([#15657](#15657))


- feat: pass `form` remote function instance into `enhance` callback
([#15657](#15657))

### Patch Changes

- fix: resolve the app payload without using `process.env.NODE_ENV`
([#15852](#15852))


- fix: support `exactOptionalPropertyTypes` for optional route params
([#15825](#15825))


- fix: correctly send `true` value to the server for 'submit' and
'hidden' form fields
([#15858](#15858))


- fix: avoid build warnings about undefined universal hooks
([#15895](#15895))


- fix: prefer default error page when failing to decode the URL pathname
([#15744](#15744))


- fix: disable link prefetching on slow internet connections
([#15885](#15885))


- fix: allow routes ending with optional parameters next to more
specific routes ([#15861](#15861))


- fix: remove reliance on Content-Length header in
deserialize_binary_form, which caused failures when proxies (e.g.
Vercel, Azure) strip the header and use chunked transfer encoding
([#15796](#15796))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants