Skip to content

util: avoid quadratic whitespace scan in MIMEType parser#63916

Open
uwezkhan wants to merge 1 commit into
nodejs:mainfrom
uwezkhan:mime-trailing-ws-scan
Open

util: avoid quadratic whitespace scan in MIMEType parser#63916
uwezkhan wants to merge 1 commit into
nodejs:mainfrom
uwezkhan:mime-trailing-ws-scan

Conversation

@uwezkhan

Copy link
Copy Markdown

The MIME parser trims trailing HTTP whitespace from the subtype, the parameter list, and each parameter value by searching against the unanchored regex /[\r\n\t ]*$/. String.prototype.search restarts that match from every offset, so a long run of internal whitespace makes each trim O(n^2). The run is reachable from untrusted input through the public util.MIMEType API and through data: URL parsing, e.g. new MIMEType('text/plain;x=a' + ' '.repeat(60000) + 'b'), which is a quadratic-blowup ReDoS.

Replacing the three searches with a backward whitespace scan returns the same start-of-trailing-whitespace index in linear time. Keeping the bound in the parser rather than asking callers to pre-trim matters because the constructor, the lazy params parse, and the value parse all funnel through the same trim and consume that index identically. The helper is a few lines longer than the regex constant in exchange for dropping the quadratic factor; parse output is unchanged, verified equivalent to the old regex over 300k random inputs.

Before vs after, same 60k input:

before: util.MIMEType parse blocks the event loop ~8000ms
after:  ~0.03ms, same as a benign 'text/plain;x=ab'

Signed-off-by: uwezkhan <uwezkhan053@gmail.com>
@nodejs-github-bot nodejs-github-bot added the needs-ci PRs that need a full CI run. label Jun 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants