From d6a43438d6ed3f262cc87fe2ebd0c46a87c1ff57 Mon Sep 17 00:00:00 2001 From: Szymon Marczak Date: Sun, 2 Sep 2018 12:07:20 +0200 Subject: [PATCH] http2: don't expose the original socket through the socket proxy Refs: https://github.com/nodejs/node/pull/22486 PR-URL: https://github.com/nodejs/node/pull/22650 Reviewed-By: Matteo Collina Reviewed-By: Luigi Pinca Reviewed-By: Anatoli Papirovski Reviewed-By: James M Snell --- lib/internal/http2/core.js | 14 +++++++++-- test/parallel/test-http2-socket-proxy.js | 11 ++++++++ .../test-http2-unbound-socket-proxy.js | 25 ------------------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index ad4f98593da270..f2a298b6e5df69 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -646,7 +646,9 @@ const proxySocketHandler = { get(session, prop) { switch (prop) { case 'setTimeout': - return session.setTimeout.bind(session); + case 'ref': + case 'unref': + return session[prop].bind(session); case 'destroy': case 'emit': case 'end': @@ -654,6 +656,9 @@ const proxySocketHandler = { case 'read': case 'resume': case 'write': + case 'setEncoding': + case 'setKeepAlive': + case 'setNoDelay': throw new ERR_HTTP2_NO_SOCKET_MANIPULATION(); default: const socket = session[kSocket]; @@ -672,7 +677,9 @@ const proxySocketHandler = { set(session, prop, value) { switch (prop) { case 'setTimeout': - session.setTimeout = value; + case 'ref': + case 'unref': + session[prop] = value; return true; case 'destroy': case 'emit': @@ -681,6 +688,9 @@ const proxySocketHandler = { case 'read': case 'resume': case 'write': + case 'setEncoding': + case 'setKeepAlive': + case 'setNoDelay': throw new ERR_HTTP2_NO_SOCKET_MANIPULATION(); default: const socket = session[kSocket]; diff --git a/test/parallel/test-http2-socket-proxy.js b/test/parallel/test-http2-socket-proxy.js index f7d97a3bb11e8a..64daeb62baebf2 100644 --- a/test/parallel/test-http2-socket-proxy.js +++ b/test/parallel/test-http2-socket-proxy.js @@ -42,6 +42,9 @@ server.on('stream', common.mustCall(function(stream, headers) { common.expectsError(() => socket.read, errMsg); common.expectsError(() => socket.resume, errMsg); common.expectsError(() => socket.write, errMsg); + common.expectsError(() => socket.setEncoding, errMsg); + common.expectsError(() => socket.setKeepAlive, errMsg); + common.expectsError(() => socket.setNoDelay, errMsg); common.expectsError(() => (socket.destroy = undefined), errMsg); common.expectsError(() => (socket.emit = undefined), errMsg); @@ -50,11 +53,19 @@ server.on('stream', common.mustCall(function(stream, headers) { common.expectsError(() => (socket.read = undefined), errMsg); common.expectsError(() => (socket.resume = undefined), errMsg); common.expectsError(() => (socket.write = undefined), errMsg); + common.expectsError(() => (socket.setEncoding = undefined), errMsg); + common.expectsError(() => (socket.setKeepAlive = undefined), errMsg); + common.expectsError(() => (socket.setNoDelay = undefined), errMsg); // Resetting the socket listeners to their own value should not throw. socket.on = socket.on; // eslint-disable-line no-self-assign socket.once = socket.once; // eslint-disable-line no-self-assign + socket.unref(); + assert.strictEqual(socket._handle.hasRef(), false); + socket.ref(); + assert.strictEqual(socket._handle.hasRef(), true); + stream.respond(); socket.writable = 0; diff --git a/test/parallel/test-http2-unbound-socket-proxy.js b/test/parallel/test-http2-unbound-socket-proxy.js index 44f113bac962f7..18881574f2c09b 100644 --- a/test/parallel/test-http2-unbound-socket-proxy.js +++ b/test/parallel/test-http2-unbound-socket-proxy.js @@ -39,31 +39,6 @@ server.listen(0, common.mustCall(() => { }, { code: 'ERR_HTTP2_SOCKET_UNBOUND' }); - common.expectsError(() => { - socket.ref(); - }, { - code: 'ERR_HTTP2_SOCKET_UNBOUND' - }); - common.expectsError(() => { - socket.unref(); - }, { - code: 'ERR_HTTP2_SOCKET_UNBOUND' - }); - common.expectsError(() => { - socket.setEncoding(); - }, { - code: 'ERR_HTTP2_SOCKET_UNBOUND' - }); - common.expectsError(() => { - socket.setKeepAlive(); - }, { - code: 'ERR_HTTP2_SOCKET_UNBOUND' - }); - common.expectsError(() => { - socket.setNoDelay(); - }, { - code: 'ERR_HTTP2_SOCKET_UNBOUND' - }); })); })); }));