Skip to content

Commit 5f41f1b

Browse files
davedoesdevdanielleadams
authored andcommitted
http2: check write not scheduled in scope destructor
Fixes: #33156 PR-URL: #36241 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
1 parent ea46ca8 commit 5f41f1b

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

src/node_http2.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ Http2Scope::Http2Scope(Http2Session* session) : session_(session) {
8888
Http2Scope::~Http2Scope() {
8989
if (!session_) return;
9090
session_->set_in_scope(false);
91-
session_->MaybeScheduleWrite();
91+
if (!session_->is_write_scheduled())
92+
session_->MaybeScheduleWrite();
9293
}
9394

9495
// The Http2Options object is used during the construction of Http2Session
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'use strict';
2+
// https://github.com/nodejs/node/issues/33156
3+
const common = require('../common');
4+
const fixtures = require('../common/fixtures');
5+
6+
if (!common.hasCrypto) {
7+
common.skip('missing crypto');
8+
}
9+
10+
const http2 = require('http2');
11+
12+
const key = fixtures.readKey('agent8-key.pem', 'binary');
13+
const cert = fixtures.readKey('agent8-cert.pem', 'binary');
14+
const ca = fixtures.readKey('fake-startcom-root-cert.pem', 'binary');
15+
16+
const server = http2.createSecureServer({
17+
key,
18+
cert,
19+
maxSessionMemory: 1000
20+
});
21+
22+
let client_stream;
23+
24+
server.on('session', common.mustCall(function(session) {
25+
session.on('stream', common.mustCall(function(stream) {
26+
stream.resume();
27+
stream.on('data', function() {
28+
this.write(Buffer.alloc(1));
29+
process.nextTick(() => client_stream.destroy());
30+
});
31+
}));
32+
}));
33+
34+
server.listen(0, function() {
35+
const client = http2.connect(`https://localhost:${server.address().port}`, {
36+
ca,
37+
maxSessionMemory: 1000
38+
});
39+
client_stream = client.request({ ':method': 'POST' });
40+
client_stream.on('close', common.mustCall(() => {
41+
client.close();
42+
server.close();
43+
}));
44+
client_stream.resume();
45+
client_stream.write(Buffer.alloc(64 * 1024));
46+
});

0 commit comments

Comments
 (0)