Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 24033ee

Browse filesBrowse files
Melteddaduh95
authored andcommitted
http: fix rawHeaders exceeding maxHeadersCount limit
Fixes: #61284 PR-URL: #61285 Reviewed-By: Tim Perry <pimterry@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: René <contact.9a5d6388@renegade334.me.uk> Reviewed-By: Ethan Arrowood <ethan@arrowood.dev>
1 parent b5cdc27 commit 24033ee
Copy full SHA for 24033ee

2 files changed

+30-2Lines changed: 30 additions & 2 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎lib/_http_common.js‎

Copy file name to clipboardExpand all lines: lib/_http_common.js
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ const MAX_HEADER_PAIRS = 2000;
5959
// called to process trailing HTTP headers.
6060
function parserOnHeaders(headers, url) {
6161
// Once we exceeded headers limit - stop collecting them
62-
if (this.maxHeaderPairs <= 0 ||
63-
this._headers.length < this.maxHeaderPairs) {
62+
const capacity = this.maxHeaderPairs - this._headers.length;
63+
if (this.maxHeaderPairs <= 0 || capacity >= headers.length) {
6464
this._headers.push(...headers);
65+
} else if (capacity > 0) {
66+
this._headers.push(...headers.slice(0, capacity));
6567
}
6668
this._url += url;
6769
}
Collapse file
+26Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const http = require('http');
5+
const net = require('net');
6+
7+
const server = http.createServer(common.mustCall((req, res) => {
8+
const limit = server.maxHeadersCount * 2;
9+
assert.ok(req.rawHeaders.length <= limit,
10+
`rawHeaders.length (${req.rawHeaders.length}) exceeds limit (${limit})`);
11+
res.end();
12+
server.close();
13+
}));
14+
15+
server.maxHeadersCount = 50;
16+
17+
server.listen(0, common.mustCall(() => {
18+
const port = server.address().port;
19+
const headers = Array.from({ length: 65 }, (_, i) => `X-${i}:v`).join('\r\n');
20+
const req = `GET / HTTP/1.1\r\nHost: localhost\r\n${headers}\r\n\r\n`;
21+
22+
net.createConnection(port, 'localhost', function() {
23+
this.write(req);
24+
this.once('data', () => this.end());
25+
});
26+
}));

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.