uv_buf_t buf;
// Copy given buffer entirely or partiall if handle becomes closed
- while (len > 0 && !wrap->IsClosing()) {
+ while (len > 0 && wrap->IsAlive() && !wrap->IsClosing()) {
wrap->stream_->OnAlloc(len, &buf);
size_t copy = buf.len > len ? len : buf.len;
memcpy(buf.base, data, copy);
if (established_ && !write_item_queue_.IsEmpty())
MakePending();
+ if (ssl_ == nullptr)
+ return;
+
// No data to write
if (BIO_pending(enc_out_) == 0) {
if (clear_in_->Length() == 0)
if (eof_)
return;
- CHECK_NE(ssl_, nullptr);
+ if (ssl_ == nullptr)
+ return;
char out[kClearOutChunkSize];
int read;
if (!hello_parser_.IsEnded())
return false;
+ if (ssl_ == nullptr)
+ return false;
+
int written = 0;
while (clear_in_->Length() > 0) {
size_t avail = 0;
bool TLSWrap::IsAlive() {
- return stream_->IsAlive();
+ return ssl_ != nullptr && stream_->IsAlive();
}
return 0;
}
+ if (ssl_ == nullptr)
+ return UV_EPROTO;
+
int written = 0;
for (i = 0; i < count; i++) {
written = SSL_write(ssl_, bufs[i].base, bufs[i].len);
}
// Only client connections can receive data
- CHECK_NE(ssl_, nullptr);
+ if (ssl_ == nullptr) {
+ OnRead(UV_EPROTO, nullptr);
+ return;
+ }
// Commit read data
NodeBIO* enc_in = NodeBIO::FromBIO(enc_in_);
int TLSWrap::DoShutdown(ShutdownWrap* req_wrap) {
- if (SSL_shutdown(ssl_) == 0)
+ if (ssl_ != nullptr && SSL_shutdown(ssl_) == 0)
SSL_shutdown(ssl_);
shutdown_ = true;
EncOut();
if (args.Length() < 2 || !args[0]->IsBoolean() || !args[1]->IsBoolean())
return env->ThrowTypeError("Bad arguments, expected two booleans");
+ if (wrap->ssl_ == nullptr)
+ return env->ThrowTypeError("SetVerifyMode after destroySSL");
+
int verify_mode;
if (wrap->is_server()) {
bool request_cert = args[0]->IsTrue();
}
+void TLSWrap::DestroySSL(const FunctionCallbackInfo<Value>& args) {
+ TLSWrap* wrap = Unwrap<TLSWrap>(args.Holder());
+ wrap->SSLWrap<TLSWrap>::DestroySSL();
+ delete wrap->clear_in_;
+ wrap->clear_in_ = nullptr;
+}
+
+
void TLSWrap::OnClientHelloParseEnd(void* arg) {
TLSWrap* c = static_cast<TLSWrap*>(arg);
c->Cycle();
TLSWrap* wrap = Unwrap<TLSWrap>(args.Holder());
+ CHECK_NE(wrap->ssl_, nullptr);
+
const char* servername = SSL_get_servername(wrap->ssl_,
TLSEXT_NAMETYPE_host_name);
if (servername != nullptr) {
if (!wrap->is_client())
return;
+ CHECK_NE(wrap->ssl_, nullptr);
+
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
node::Utf8Value servername(env->isolate(), args[0].As<String>());
SSL_set_tlsext_host_name(wrap->ssl_, *servername);
env->SetProtoMethod(t, "setVerifyMode", SetVerifyMode);
env->SetProtoMethod(t, "enableSessionCallbacks", EnableSessionCallbacks);
env->SetProtoMethod(t, "enableHelloParser", EnableHelloParser);
+ env->SetProtoMethod(t, "destroySSL", DestroySSL);
StreamBase::AddMethods<TLSWrap>(env, t, StreamBase::kFlagHasWritev);
SSLWrap<TLSWrap>::AddMethods(env, t);