10000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent ba91c41 commit 99749dcCopy full SHA for 99749dc
lib/_tls_wrap.js
@@ -391,6 +391,12 @@ TLSSocket.prototype._wrapHandle = function(wrap) {
391
res = null;
392
});
393
394
+ if (wrap) {
395
+ wrap.on('close', function() {
396
+ res.onStreamClose();
397
+ });
398
+ }
399
+
400
return res;
401
};
402
src/tls_wrap.cc
@@ -523,7 +523,7 @@ int TLSWrap::GetFD() {
523
524
525
bool TLSWrap::IsAlive() {
526
- return ssl_ != nullptr && stream_->IsAlive();
+ return ssl_ != nullptr && stream_ != nullptr && stream_->IsAlive();
527
}
528
529
@@ -783,6 +783,14 @@ void TLSWrap::EnableSessionCallbacks(
783
784
785
786
+void TLSWrap::OnStreamClose(const FunctionCallbackInfo<Value>& args) {
787
+ TLSWrap* wrap;
788
+ ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
789
790
+ wrap->stream_ = nullptr;
791
+}
792
793
794
void TLSWrap::DestroySSL(const FunctionCallbackInfo<Value>& args) {
795
TLSWrap* wrap;
796
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
@@ -913,6 +921,7 @@ void TLSWrap::Initialize(Local<Object> target,
913
921
env->SetProtoMethod(t, "enableSessionCallbacks", EnableSessionCallbacks);
914
922
env->SetProtoMethod(t, "destroySSL", DestroySSL);
915
923
env->SetProtoMethod(t, "enableCertCb", EnableCertCb);
924
+ env->SetProtoMethod(t, "onStreamClose", OnStreamClose);
916
925
917
926
StreamBase::AddMethods<TLSWrap>(env, t, StreamBase::kFlagHasWritev);
918
927
SSLWrap<TLSWrap>::AddMethods(env, t);
src/tls_wrap.h
@@ -135,6 +135,7 @@ class TLSWrap : public AsyncWrap,
135
static void EnableCertCb(
136
const v8::FunctionCallbackInfo<v8::Value>& args);
137
static void DestroySSL(const v8::FunctionCallbackInfo<v8::Value>& args);
138
+ static void OnStreamClose(const v8::FunctionCallbackInfo<v8::Value>& args);
139
140
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
141
static void GetServername(const v8::FunctionCallbackInfo<v8::Value>& args);
test/parallel/test-tls-socket-close.js
@@ -0,0 +1,43 @@
1
+'use strict';
2
+const common = require('../common');
3
+const assert = require('assert');
4
5
+const tls = require('tls');
6
+const fs = require('fs');
7
+const net = require('net');
8
9
+const key = fs.readFileSync(common.fixturesDir + '/keys/agent2-key.pem');
10
+const cert = fs.readFileSync(common.fixturesDir + '/keys/agent2-cert.pem');
11
12
+const T = 100;
13
14
+// tls server
15
+const tlsServer = tls.createServer({ cert, key }, (socket) => {
16
+ setTimeout(() => {
17
+ socket.on('error', (error) => {
18
+ assert.strictEqual(error.code, 'EINVAL');
19
+ tlsServer.close();
20
+ netServer.close();
21
22
+ socket.write('bar');
23
+ }, T * 2);
24
+});
25
26
+// plain tcp server
27
+const netServer = net.createServer((socket) => {
28
+ // if client wants to use tls
29
+ tlsServer.emit('connection', socket);
30
31
+ socket.setTimeout(T, () => {
32
+ // this breaks if TLSSocket is already managing the socket:
33
+ socket.destroy();
34
35
+}).listen(0, common.mustCall(function() {
36
37
+ // connect client
38
+ tls.connect({
39
+ host: 'localhost',
40
+ port: this.address().port,
41
+ rejectUnauthorized: false
42
+ }).write('foo');
43
+}));