diff --git a/native/src/base/include/stream.hpp b/native/src/base/include/stream.hpp index 09b34f3c6..5cb5a1deb 100644 --- a/native/src/base/include/stream.hpp +++ b/native/src/base/include/stream.hpp @@ -90,7 +90,7 @@ private: rust::Vec &_data; size_t _pos = 0; - void ensure_size(size_t sz); + void ensure_size(size_t sz, bool zero = false); }; class file_channel : public channel { diff --git a/native/src/base/lib.rs b/native/src/base/lib.rs index e05dc3f5e..286905ac8 100644 --- a/native/src/base/lib.rs +++ b/native/src/base/lib.rs @@ -66,5 +66,10 @@ fn set_log_level_state_cxx(level: ffi::LogLevelCxx, enabled: bool) { } fn resize_vec(vec: &mut Vec, size: usize) { - vec.resize(size, 0); + if size > vec.len() { + vec.reserve(size - vec.len()); + } + unsafe { + vec.set_len(size); + } } diff --git a/native/src/base/stream.cpp b/native/src/base/stream.cpp index 3628b14e0..8bebf2eaf 100644 --- a/native/src/base/stream.cpp +++ b/native/src/base/stream.cpp @@ -209,15 +209,17 @@ off_t rust_vec_channel::seek(off_t off, int whence) { default: return -1; } - ensure_size(np); + ensure_size(np, true); _pos = np; return np; } -void rust_vec_channel::ensure_size(size_t sz) { +void rust_vec_channel::ensure_size(size_t sz, bool zero) { size_t old_sz = _data.size(); if (sz > old_sz) { resize_vec(_data, sz); + if (zero) + memset(_data.data() + old_sz, 0, sz - old_sz); } }