summaryrefslogtreecommitdiff
path: root/src/node_crypto_bio.cc
diff options
context:
space:
mode:
authorFedor Indutny <fedor.indutny@gmail.com>2013-06-07 15:31:24 +0400
committerFedor Indutny <fedor.indutny@gmail.com>2013-06-08 15:40:57 +0400
commit9ae1d182ba98629ac7c7b9100022ac93133494b7 (patch)
tree3e989db1f9f1c59ce2f72a4d861e80e666a835ea /src/node_crypto_bio.cc
parent4bb4f734b3dc3cd42ffd7c5d128fec2abd6b97dd (diff)
downloadandroid-node-v8-9ae1d182ba98629ac7c7b9100022ac93133494b7.tar.gz
android-node-v8-9ae1d182ba98629ac7c7b9100022ac93133494b7.tar.bz2
android-node-v8-9ae1d182ba98629ac7c7b9100022ac93133494b7.zip
crypto: free excessive memory in NodeBIO
Before this commit NodeBIO never shrank, possibly consuming a lot of memory (depending on reader's haste). All buffers between write_head's child and read_head should be deallocated on read, leaving only space left in write_head and in the next buffer.
Diffstat (limited to 'src/node_crypto_bio.cc')
-rw-r--r--src/node_crypto_bio.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/node_crypto_bio.cc b/src/node_crypto_bio.cc
index 52e5e78274..64d9efaf04 100644
--- a/src/node_crypto_bio.cc
+++ b/src/node_crypto_bio.cc
@@ -210,10 +210,34 @@ size_t NodeBIO::Read(char* out, size_t size) {
assert(expected == bytes_read);
length_ -= bytes_read;
+ // Free all empty buffers, but write_head's child
+ FreeEmpty();
+
return bytes_read;
}
+void NodeBIO::FreeEmpty() {
+ Buffer* child = write_head_->next_;
+ if (child == write_head_ || child == read_head_)
+ return;
+ Buffer* cur = child->next_;
+ if (cur == write_head_ || cur == read_head_)
+ return;
+
+ while (cur != read_head_) {
+ assert(cur != write_head_);
+ assert(cur->write_pos_ == cur->read_pos_);
+
+ Buffer* next = cur->next_;
+ child->next_ = next;
+ delete cur;
+
+ cur = next;
+ }
+}
+
+
size_t NodeBIO::IndexOf(char delim, size_t limit) {
size_t bytes_read = 0;
size_t max = Length() > limit ? limit : Length();