diff options
author | Fedor Indutny <fedor.indutny@gmail.com> | 2013-06-07 15:31:24 +0400 |
---|---|---|
committer | Fedor Indutny <fedor.indutny@gmail.com> | 2013-06-08 15:40:57 +0400 |
commit | 9ae1d182ba98629ac7c7b9100022ac93133494b7 (patch) | |
tree | 3e989db1f9f1c59ce2f72a4d861e80e666a835ea /src/node_crypto_bio.cc | |
parent | 4bb4f734b3dc3cd42ffd7c5d128fec2abd6b97dd (diff) | |
download | android-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.cc | 24 |
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(); |