diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index 78ba7126dfebb0..1f1e1eeb2d8169 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -47,7 +47,6 @@ TLSWrap::TLSWrap(Environment* env, started_(false), established_(false), shutdown_(false), - error_(nullptr), cycle_depth_(0), eof_(false) { node::Wrap(object(), this); @@ -84,8 +83,6 @@ TLSWrap::~TLSWrap() { #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB sni_context_.Reset(); #endif // SSL_CTRL_SET_TLSEXT_SERVERNAME_CB - - ClearError(); } @@ -348,7 +345,7 @@ void TLSWrap::EncOutCb(WriteWrap* req_wrap, int status) { } -Local TLSWrap::GetSSLError(int status, int* err, const char** msg) { +Local TLSWrap::GetSSLError(int status, int* err, std::string* msg) { EscapableHandleScope scope(env()->isolate()); // ssl_ is already destroyed in reading EOF by close notify alert. @@ -379,13 +376,9 @@ Local TLSWrap::GetSSLError(int status, int* err, const char** msg) { OneByteString(env()->isolate(), mem->data, mem->length); Local exception = Exception::Error(message); - if (msg != nullptr) { - CHECK_EQ(*msg, nullptr); - char* const buf = new char[mem->length + 1]; - memcpy(buf, mem->data, mem->length); - buf[mem->length] = '\0'; - *msg = buf; - } + if (msg != nullptr) + msg->assign(mem->data, mem->data + mem->length); + BIO_free_all(bio); return scope.Escape(exception); @@ -497,12 +490,11 @@ bool TLSWrap::ClearIn() { // Error or partial write int err; - const char* error_str = nullptr; + std::string error_str; Local arg = GetSSLError(written, &err, &error_str); if (!arg.IsEmpty()) { MakePending(); - InvokeQueued(UV_EPROTO, error_str); - delete[] error_str; + InvokeQueued(UV_EPROTO, error_str.c_str()); clear_in_->Reset(); } @@ -551,13 +543,12 @@ int TLSWrap::ReadStop() { const char* TLSWrap::Error() const { - return error_; + return error_.empty() ? nullptr : error_.c_str(); } void TLSWrap::ClearError() { - delete[] error_; - error_ = nullptr; + error_.clear(); } @@ -605,11 +596,7 @@ int TLSWrap::DoWrite(WriteWrap* w, if (ssl_ == nullptr) { ClearError(); - - static char msg[] = "Write after DestroySSL"; - char* tmp = new char[sizeof(msg)]; - memcpy(tmp, msg, sizeof(msg)); - error_ = tmp; + error_ = "Write after DestroySSL"; return UV_EPROTO; } diff --git a/src/tls_wrap.h b/src/tls_wrap.h index 95d26bb91734e3..dbb1a0199e4e66 100644 --- a/src/tls_wrap.h +++ b/src/tls_wrap.h @@ -14,6 +14,8 @@ #include +#include + namespace node { // Forward-declarations @@ -127,8 +129,7 @@ class TLSWrap : public AsyncWrap, void DoRead(ssize_t nread, const uv_buf_t* buf, uv_handle_type pending); - // If |msg| is not nullptr, caller is responsible for calling `delete[] *msg`. - v8::Local GetSSLError(int status, int* err, const char** msg); + v8::Local GetSSLError(int status, int* err, std::string* msg); static void OnClientHelloParseEnd(void* arg); static void Wrap(const v8::FunctionCallbackInfo& args); @@ -159,7 +160,7 @@ class TLSWrap : public AsyncWrap, bool started_; bool established_; bool shutdown_; - const char* error_; + std::string error_; int cycle_depth_; // If true - delivered EOF to the js-land, either after `close_notify`, or