From e4c461ba7daeaf820a5228254446bd1592bce3d5 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 5 Oct 2017 16:02:57 +0200 Subject: [PATCH] src: replace manual memory mgmt with std::string PR-URL: https://github.com/nodejs/node/pull/15782 Reviewed-By: Anna Henningsen Reviewed-By: Timothy Gu Reviewed-By: Daniel Bevenius Reviewed-By: Colin Ihrig Reviewed-By: Minwoo Jung Reviewed-By: James M Snell --- src/tls_wrap.cc | 31 +++++++++---------------------- src/tls_wrap.h | 7 ++++--- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index dce05fabd62160..093dc72af3b790 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -66,7 +66,6 @@ TLSWrap::TLSWrap(Environment* env, started_(false), established_(false), shutdown_(false), - error_(nullptr), cycle_depth_(0), eof_(false) { node::Wrap(object(), this); @@ -103,8 +102,6 @@ TLSWrap::~TLSWrap() { #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB sni_context_.Reset(); #endif // SSL_CTRL_SET_TLSEXT_SERVERNAME_CB - - ClearError(); } @@ -367,7 +364,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. @@ -398,13 +395,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); @@ -516,12 +509,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(); } @@ -570,13 +562,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(); } @@ -624,11 +615,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 9d559f7a721ea6..fe3abe04f5556a 100644 --- a/src/tls_wrap.h +++ b/src/tls_wrap.h @@ -35,6 +35,8 @@ #include +#include + namespace node { // Forward-declarations @@ -148,8 +150,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); @@ -180,7 +181,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