Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 4d37472

Browse filesBrowse files
indutnyMyles Borins
authored andcommitted
tls_wrap: clear errors on return
Adopt `MarkPopErrorOnReturn` from `node_crypto.cc`, and use it to clear errors after `SSL_read`/`SSL_write`/`SSL_shutdown` functions. See: #4485 PR-URL: #4515 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> v4.x-staging Commit Metadata: PR-URL: #4709 Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 5f4aa79 commit 4d37472
Copy full SHA for 4d37472

File tree

Expand file treeCollapse file tree

3 files changed

+24
-9
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

3 files changed

+24
-9
lines changed
Open diff view settings
Collapse file

‎src/node_crypto.cc‎

Copy file name to clipboardExpand all lines: src/node_crypto.cc
-8Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,6 @@ static X509_NAME *cnnic_ev_name =
116116
d2i_X509_NAME(nullptr, &cnnic_ev_p,
117117
sizeof(CNNIC_EV_ROOT_CA_SUBJECT_DATA)-1);
118118

119-
// Forcibly clear OpenSSL's error stack on return. This stops stale errors
120-
// from popping up later in the lifecycle of crypto operations where they
121-
// would cause spurious failures. It's a rather blunt method, though.
122-
// ERR_clear_error() isn't necessarily cheap either.
123-
struct ClearErrorOnReturn {
124-
~ClearErrorOnReturn() { ERR_clear_error(); }
125-
};
126-
127119
static uv_mutex_t* locks;
128120

129121
const char* const root_certs[] = {
Collapse file

‎src/node_crypto.h‎

Copy file name to clipboardExpand all lines: src/node_crypto.h
+15Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,21 @@
4141
namespace node {
4242
namespace crypto {
4343

44+
// Forcibly clear OpenSSL's error stack on return. This stops stale errors
45+
// from popping up later in the lifecycle of crypto operations where they
46+
// would cause spurious failures. It's a rather blunt method, though.
47+
// ERR_clear_error() isn't necessarily cheap either.
48+
struct ClearErrorOnReturn {
49+
~ClearErrorOnReturn() { ERR_clear_error(); }
50+
};
51+
52+
// Pop errors from OpenSSL's error stack that were added
53+
// between when this was constructed and destructed.
54+
struct MarkPopErrorOnReturn {
55+
MarkPopErrorOnReturn() { ERR_set_mark(); }
56+
~MarkPopErrorOnReturn() { ERR_pop_to_mark(); }
57+
};
58+
4459
enum CheckResult {
4560
CHECK_CERT_REVOKED = 0,
4661
CHECK_OK = 1
Collapse file

‎src/tls_wrap.cc‎

Copy file name to clipboardExpand all lines: src/tls_wrap.cc
+9-1Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ using v8::Object;
3131
using v8::String;
3232
using v8::Value;
3333

34-
3534
TLSWrap::TLSWrap(Environment* env,
3635
Kind kind,
3736
StreamBase* stream,
@@ -401,6 +400,8 @@ void TLSWrap::ClearOut() {
401400
if (ssl_ == nullptr)
402401
return;
403402

403+
crypto::MarkPopErrorOnReturn mark_pop_error_on_return;
404+
404405
char out[kClearOutChunkSize];
405406
int read;
406407
for (;;) {
@@ -462,6 +463,8 @@ bool TLSWrap::ClearIn() {
462463
if (ssl_ == nullptr)
463464
return false;
464465

466+
crypto::MarkPopErrorOnReturn mark_pop_error_on_return;
467+
465468
int written = 0;
466469
while (clear_in_->Length() > 0) {
467470
size_t avail = 0;
@@ -589,6 +592,8 @@ int TLSWrap::DoWrite(WriteWrap* w,
589592
if (ssl_ == nullptr)
590593
return UV_EPROTO;
591594

595+
crypto::MarkPopErrorOnReturn mark_pop_error_on_return;
596+
592597
int written = 0;
593598
for (i = 0; i < count; i++) {
594599
written = SSL_write(ssl_, bufs[i].base, bufs[i].len);
@@ -704,8 +709,11 @@ void TLSWrap::DoRead(ssize_t nread,
704709

705710

706711
int TLSWrap::DoShutdown(ShutdownWrap* req_wrap) {
712+
crypto::MarkPopErrorOnReturn mark_pop_error_on_return;
713+
707714
if (ssl_ != nullptr && SSL_shutdown(ssl_) == 0)
708715
SSL_shutdown(ssl_);
716+
709717
shutdown_ = true;
710718
EncOut();
711719
return stream_->DoShutdown(req_wrap);

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.