From 05362562178478292853643343c8dd2618c96e51 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 29 Apr 2021 23:38:35 +0200 Subject: [PATCH] Add clamping to IBStream implementation seek --- src/common/serialization/vst3/bstream.cpp | 15 +++++++++------ src/common/serialization/vst3/bstream.h | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/common/serialization/vst3/bstream.cpp b/src/common/serialization/vst3/bstream.cpp index 2fb0916e..e48514c5 100644 --- a/src/common/serialization/vst3/bstream.cpp +++ b/src/common/serialization/vst3/bstream.cpp @@ -139,8 +139,9 @@ tresult PLUGIN_API YaBStream::read(void* buffer, return Steinberg::kInvalidArgument; } - size_t bytes_to_read = std::min(static_cast(numBytes), - this->buffer.size() - seek_position); + const int64_t bytes_to_read = + std::min(static_cast(numBytes), + static_cast(this->buffer.size()) - seek_position); std::copy_n(&this->buffer[seek_position], bytes_to_read, reinterpret_cast(buffer)); @@ -160,12 +161,12 @@ tresult PLUGIN_API YaBStream::write(void* buffer, return Steinberg::kInvalidArgument; } - if (seek_position + numBytes > this->buffer.size()) { + if (seek_position + numBytes > static_cast(this->buffer.size())) { this->buffer.resize(seek_position + numBytes); } std::copy_n(reinterpret_cast(buffer), numBytes, - this->buffer.begin() + static_cast(seek_position)); + &this->buffer[seek_position]); seek_position += numBytes; if (numBytesWritten) { @@ -184,13 +185,15 @@ tresult PLUGIN_API YaBStream::seek(int64 pos, int32 mode, int64* result) { seek_position += pos; break; case kIBSeekEnd: - seek_position = this->buffer.size() + pos; + seek_position = static_cast(buffer.size()) + pos; break; default: return Steinberg::kInvalidArgument; break; } + seek_position = std::clamp(seek_position, static_cast(0), + static_cast(buffer.size())); if (result) { *result = static_cast(seek_position); } @@ -200,7 +203,7 @@ tresult PLUGIN_API YaBStream::seek(int64 pos, int32 mode, int64* result) { tresult PLUGIN_API YaBStream::tell(int64* pos) { if (pos) { - *pos = static_cast(seek_position); + *pos = seek_position; return Steinberg::kResultOk; } else { return Steinberg::kInvalidArgument; diff --git a/src/common/serialization/vst3/bstream.h b/src/common/serialization/vst3/bstream.h index 491192f0..d751c977 100644 --- a/src/common/serialization/vst3/bstream.h +++ b/src/common/serialization/vst3/bstream.h @@ -120,7 +120,7 @@ class YaBStream : public Steinberg::IBStream, private: std::vector buffer; - size_t seek_position = 0; + int64_t seek_position = 0; }; #pragma GCC diagnostic pop