tls_wrap: fix this incredibly stupid leak
authorFedor Indutny <fedor@indutny.com>
Wed, 25 Mar 2015 03:21:32 +0000 (20:21 -0700)
committerFedor Indutny <fedor@indutny.com>
Wed, 25 Mar 2015 22:51:05 +0000 (17:51 -0500)
Always call `Done` on the WriteWrap, and ensure that `EncOut` will
consume all data in clear_in_ and invoke queued callbacks.

Fix: https://github.com/iojs/io.js/issues/1075
PR-URL: https://github.com/iojs/io.js/pull/1244
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
src/tls_wrap.cc

index b6b87b3..c774a84 100644 (file)
@@ -90,8 +90,7 @@ TLSWrap::~TLSWrap() {
   MakePending();
 
   // And destroy
-  while (WriteItem* wi = pending_write_items_.PopFront())
-    delete wi;
+  InvokeQueued(UV_ECANCELED);
 
   ClearError();
 }
@@ -310,10 +309,12 @@ void TLSWrap::EncOut() {
   write_req->Dispatched();
 
   // Ignore errors, this should be already handled in js
-  if (err)
+  if (err) {
     write_req->Dispose();
-  else
+    InvokeQueued(err);
+  } else {
     NODE_COUNT_NET_BYTES_SENT(write_size_);
+  }
 }
 
 
@@ -335,6 +336,9 @@ void TLSWrap::EncOutCb(WriteWrap* req_wrap, int status) {
   // Commit
   NodeBIO::FromBIO(wrap->enc_out_)->Read(nullptr, wrap->write_size_);
 
+  // Ensure that the progress will be made and `InvokeQueued` will be called.
+  wrap->ClearIn();
+
   // Try writing more data
   wrap->write_size_ = 0;
   wrap->EncOut();