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
@uwezkhan

uwezkhan commented Jul 8, 2026

Copy link
Copy Markdown
Author

any update?

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