diff options
-rw-r--r-- | modules/codec/c++/transport.hpp | 12 | ||||
-rw-r--r-- | modules/core/c++/buffer.cpp | 61 | ||||
-rw-r--r-- | modules/core/c++/buffer.hpp | 3 |
3 files changed, 53 insertions, 23 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp index 0bb70eb..77baf36 100644 --- a/modules/codec/c++/transport.hpp +++ b/modules/codec/c++/transport.hpp @@ -22,9 +22,19 @@ public: error_or<buffer_view> view_slice(buffer& buff) const { (void) buff; + typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type val{}; buffer_view view{buff}; - return make_error<err::not_implemented>(); + auto eov = stream_value<schema::Primitive<schema::UnsignedInteger, Len>>::decode(val, view); + if(eov.is_error()){ + return std::move(eov.get_error()); + } + + if(view.read_composite_length() < val){ + return make_error<err::buffer_exhausted>(); + } + + return view; } error_or<array_buffer> chain_slice(chain_array_buffer& buff) const { diff --git a/modules/core/c++/buffer.cpp b/modules/core/c++/buffer.cpp index 12df1ab..0e28524 100644 --- a/modules/core/c++/buffer.cpp +++ b/modules/core/c++/buffer.cpp @@ -82,26 +82,40 @@ std::string convert_to_string(const buffer& buff){ return oss.str(); } -buffer_view::buffer_view(buffer &buffer) - : buffer_{&buffer}, read_offset_{0}, write_offset_{0} {} +buffer_view::buffer_view(buffer &buffer__): + buffer_{&buffer__}, + read_offset_{0}, + write_offset_{0}, + read_limit_{buffer__.read_composite_length()}, + write_limit_{buffer__.write_composite_length()} +{} + +buffer_view::buffer_view(buffer &buffer__, uint64_t read_limit__, uint64_t write_limit__): + buffer_{&buffer__}, + read_offset_{0}, + write_offset_{0}, + read_limit_{read_limit__ < buffer__.read_composite_length() ? read_limit__ : buffer__.read_composite_length()}, + write_limit_{write_limit__ < buffer__.write_composite_length() ? write_limit__ : buffer__.write_composite_length()} +{} size_t buffer_view::read_position() const { return read_offset_ + buffer_->read_position(); } size_t buffer_view::read_composite_length() const { - assert(read_offset_ <= buffer_->read_composite_length()); - if (read_offset_ > buffer_->read_composite_length()) { + assert(read_offset_ <= read_limit_); + + if (read_offset_ > read_limit_) { return 0; } - return buffer_->read_composite_length() - read_offset_; + return read_limit_ - read_offset_; } size_t buffer_view::read_segment_length(size_t offset) const { size_t off = offset + read_offset_; - assert(off <= buffer_->read_composite_length()); - if (off > buffer_->read_composite_length()) { + assert(off <= read_limit_); + if (off > read_limit_) { return 0; } @@ -110,9 +124,9 @@ size_t buffer_view::read_segment_length(size_t offset) const { void buffer_view::read_advance(size_t bytes) { size_t offset = bytes + read_offset_; - assert(offset <= buffer_->read_composite_length()); - if (offset > buffer_->read_composite_length()) { - read_offset_ += buffer_->read_composite_length(); + assert(offset <= read_limit_); + if (offset > read_limit_) { + read_offset_ = read_limit_; return; } @@ -122,7 +136,7 @@ void buffer_view::read_advance(size_t bytes) { uint8_t &buffer_view::read(size_t i) { size_t pos = i + read_offset_; - assert(pos < buffer_->read_composite_length()); + assert(pos < read_limit_); return buffer_->read(pos); } @@ -130,7 +144,7 @@ uint8_t &buffer_view::read(size_t i) { const uint8_t &buffer_view::read(size_t i) const { size_t pos = i + read_offset_; - assert(pos < buffer_->read_composite_length()); + assert(pos < read_limit_); return buffer_->read(pos); } @@ -140,18 +154,18 @@ size_t buffer_view::write_position() const { } size_t buffer_view::write_composite_length() const { - assert(write_offset_ <= buffer_->write_composite_length()); - if (write_offset_ > buffer_->write_composite_length()) { + assert(write_offset_ <= write_limit_); + if (write_offset_ > write_limit_) { return 0; } - return buffer_->write_composite_length() - write_offset_; + return write_limit_ - write_offset_; } size_t buffer_view::write_segment_length(size_t offset) const { size_t off = offset + write_offset_; - assert(off <= buffer_->write_composite_length()); - if (off > buffer_->write_composite_length()) { + assert(off <= write_limit_); + if (off > write_limit_) { return 0; } @@ -160,9 +174,9 @@ size_t buffer_view::write_segment_length(size_t offset) const { void buffer_view::write_advance(size_t bytes) { size_t offset = bytes + write_offset_; - assert(offset <= buffer_->write_composite_length()); - if (offset > buffer_->write_composite_length()) { - write_offset_ += buffer_->write_composite_length(); + assert(offset <= write_limit_); + if (offset > write_limit_) { + write_offset_ = write_limit_; return; } @@ -172,7 +186,7 @@ void buffer_view::write_advance(size_t bytes) { uint8_t &buffer_view::write(size_t i) { size_t pos = i + write_offset_; - assert(pos < buffer_->write_composite_length()); + assert(pos < write_limit_); return buffer_->write(pos); } @@ -180,12 +194,15 @@ uint8_t &buffer_view::write(size_t i) { const uint8_t &buffer_view::write(size_t i) const { size_t pos = i + write_offset_; - assert(pos < buffer_->write_composite_length()); + assert(pos < write_limit_); return buffer_->write(pos); } error buffer_view::write_require_length(size_t bytes) { + if(write_offset_ + bytes > write_limit_){ + return make_error<err::buffer_exhausted>("BufferView limit reached."); + } return buffer_->write_require_length(bytes + write_offset_); } diff --git a/modules/core/c++/buffer.hpp b/modules/core/c++/buffer.hpp index 2c8fcde..c1fc25c 100644 --- a/modules/core/c++/buffer.hpp +++ b/modules/core/c++/buffer.hpp @@ -66,9 +66,12 @@ private: buffer *buffer_; size_t read_offset_; size_t write_offset_; + uint64_t limit_read_; + uint64_t limit_write_; public: buffer_view(buffer &); + buffer_view(buffer &, uint64_t limit_read_len, uint64_t limit_write_len); size_t read_position() const override; size_t read_composite_length() const override; |