Index: native_client_sdk/src/libraries/nacl_io/memfs/mem_fs_node.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/memfs/mem_fs_node.cc b/native_client_sdk/src/libraries/nacl_io/memfs/mem_fs_node.cc |
index 0040df3faeb8bb7203d737870fdc853e7798bd40..6eee9f0721b5e3c3adbcdedae3268e7a62f7422a 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/memfs/mem_fs_node.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/memfs/mem_fs_node.cc |
@@ -95,24 +95,29 @@ Error MemFsNode::Resize(off_t new_length) { |
return EINVAL; |
size_t new_size = static_cast<size_t>(new_length); |
+ size_t new_capacity = data_capacity_; |
if (new_size > data_capacity_) { |
// While the node size is small, grow exponentially. When it starts to get |
// larger, grow linearly. |
size_t extra = std::min(new_size, kMaxResizeIncrement); |
- data_capacity_ = new_size + extra; |
- } else { |
- data_capacity_ = new_size; |
+ new_capacity = new_size + extra; |
+ } else if (new_length < stat_.st_size) { |
+ // Shrinking capacity |
+ new_capacity = new_size; |
} |
- data_ = (char*)realloc(data_, data_capacity_); |
- if (data_capacity_ != 0) { |
- assert(data_ != NULL); |
- if (data_ == NULL) |
- return ENOMEM; |
- if (new_length > stat_.st_size) |
- memset(data_ + stat_.st_size, 0, new_length - stat_.st_size); |
+ if (new_capacity != data_capacity_) { |
+ data_ = (char*)realloc(data_, new_capacity); |
+ if (new_capacity != 0) { |
+ assert(data_ != NULL); |
+ if (data_ == NULL) |
+ return ENOMEM; |
+ } |
+ data_capacity_ = new_capacity; |
} |
+ if (new_length > stat_.st_size) |
+ memset(data_ + stat_.st_size, 0, new_length - stat_.st_size); |
stat_.st_size = new_length; |
return 0; |
} |