mirror of
https://github.com/nodejs/node.git
synced 2025-05-07 12:03:30 +00:00

Use the existing mechanism that we have to keep track of invalid frames
for treating this specific kind of invalid frame.
The commit that originally introduced this check was 695e38be69
,
which was supposed to proected against CVE-2019-9518, which in turn
was specifically about a *flood* of empty data frames. While these are
still invalid frames either way, it makes sense to be forgiving here
and just treat them like other invalid frames, i.e. to allow a small
(configurable) number of them.
Fixes: https://github.com/nodejs/node/issues/37849
PR-URL: https://github.com/nodejs/node/pull/37875
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
40 lines
1.1 KiB
JavaScript
40 lines
1.1 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
if (!common.hasCrypto)
|
|
common.skip('missing crypto');
|
|
const { readSync } = require('../common/fixtures');
|
|
const net = require('net');
|
|
const http2 = require('http2');
|
|
const { once } = require('events');
|
|
|
|
async function main() {
|
|
const blobWithEmptyFrame = readSync('emptyframe.http2');
|
|
const server = net.createServer((socket) => {
|
|
socket.end(blobWithEmptyFrame);
|
|
}).listen(0);
|
|
await once(server, 'listening');
|
|
|
|
for (const maxSessionInvalidFrames of [0, 2]) {
|
|
const client = http2.connect(`http://localhost:${server.address().port}`, {
|
|
maxSessionInvalidFrames
|
|
});
|
|
const stream = client.request({
|
|
':method': 'GET',
|
|
':path': '/'
|
|
});
|
|
if (maxSessionInvalidFrames) {
|
|
stream.on('error', common.mustNotCall());
|
|
client.on('error', common.mustNotCall());
|
|
} else {
|
|
stream.on('error', common.mustCall());
|
|
client.on('error', common.mustCall());
|
|
}
|
|
stream.resume();
|
|
await once(stream, 'end');
|
|
client.close();
|
|
}
|
|
server.close();
|
|
}
|
|
|
|
main().then(common.mustCall());
|