http2: explicitly disallow nested push streams · nodejs/node@a562729 · GitHub
Skip to content

Commit a562729

Browse files
jasnellrvagg
authored andcommitted
http2: explicitly disallow nested push streams
Fixes: #19095 PR-URL: #22245 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
1 parent 9e41032 commit a562729

5 files changed

Lines changed: 22 additions & 0 deletions

File tree

doc/api/errors.md

Lines changed: 6 additions & 0 deletions

doc/api/http2.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,6 +1256,9 @@ Setting the weight of a push stream is not allowed in the `HEADERS` frame. Pass
12561256
a `weight` value to `http2stream.priority` with the `silent` option set to
12571257
`true` to enable server-side bandwidth balancing between concurrent streams.
12581258

1259+
Calling `http2stream.pushStream()` from within a pushed stream is not permitted
1260+
and will throw an error.
1261+
12591262
#### http2stream.respond([headers[, options]])
12601263
<!-- YAML
12611264
added: v8.4.0

lib/internal/errors.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,8 @@ E('ERR_HTTP2_INVALID_SETTING_VALUE',
568568
E('ERR_HTTP2_INVALID_STREAM', 'The stream has been destroyed', Error);
569569
E('ERR_HTTP2_MAX_PENDING_SETTINGS_ACK',
570570
'Maximum number of pending settings acknowledgements', Error);
571+
E('ERR_HTTP2_NESTED_PUSH',
572+
'A push stream cannot initiate another push stream.', Error);
571573
E('ERR_HTTP2_NO_SOCKET_MANIPULATION',
572574
'HTTP/2 sockets should not be directly manipulated (e.g. read and written)',
573575
Error);

lib/internal/http2/core.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const {
4747
ERR_HTTP2_INVALID_SETTING_VALUE,
4848
ERR_HTTP2_INVALID_STREAM,
4949
ERR_HTTP2_MAX_PENDING_SETTINGS_ACK,
50+
ERR_HTTP2_NESTED_PUSH,
5051
ERR_HTTP2_NO_SOCKET_MANIPULATION,
5152
ERR_HTTP2_OUT_OF_STREAMS,
5253
ERR_HTTP2_PAYLOAD_FORBIDDEN,
@@ -2158,6 +2159,8 @@ class ServerHttp2Stream extends Http2Stream {
21582159
pushStream(headers, options, callback) {
21592160
if (!this.pushAllowed)
21602161
throw new ERR_HTTP2_PUSH_DISABLED();
2162+
if (this[kID] % 2 === 0)
2163+
throw new ERR_HTTP2_NESTED_PUSH();
21612164

21622165
const session = this[kSession];
21632166

test/parallel/test-http2-server-push-stream.js

Lines changed: 8 additions & 0 deletions

0 commit comments

Comments
 (0)