diff --git a/include/bitcoin/system/stream/streamers/byte_reader.hpp b/include/bitcoin/system/stream/streamers/byte_reader.hpp index 28c40436dc..3ddd639fe1 100644 --- a/include/bitcoin/system/stream/streamers/byte_reader.hpp +++ b/include/bitcoin/system/stream/streamers/byte_reader.hpp @@ -121,6 +121,7 @@ class byte_reader /// ----------------------------------------------------------------------- /// cptr/raw overrides return nullptr if reader is or becomes invalid. /// Non-null raw return must be destroyed using reader's allocator/arena. + /// Null raw return implies invalidated stream. /// Read all remaining bytes to chunk. data_chunk read_bytes() NOEXCEPT override; diff --git a/src/chain/operation.cpp b/src/chain/operation.cpp index 6aafff8bf3..d2ac572f84 100644 --- a/src/chain/operation.cpp +++ b/src/chain/operation.cpp @@ -234,6 +234,8 @@ void operation::assign_data(reader& source) NOEXCEPT { code_ = any_invalid; source.set_position(start); + + // An invalid source.read_bytes_raw returns nullptr. data_.reset(POINTER(data_chunk, allocator, source.read_bytes_raw())); } diff --git a/src/chain/witness.cpp b/src/chain/witness.cpp index 8880df19e6..feee8131a2 100644 --- a/src/chain/witness.cpp +++ b/src/chain/witness.cpp @@ -176,8 +176,12 @@ void witness::assign_data(reader& source, bool prefix) NOEXCEPT for (size_t element = 0; element < count; ++element) { + // If read_bytes_raw returns nullptr invalid source is implied. const auto size = source.read_size(max_block_weight); const auto bytes = source.read_bytes_raw(size); + if (is_null(bytes)) + break; + stack_.emplace_back(POINTER(data_chunk, allocator, bytes)); size_ = element_size(size_, stack_.back()); } @@ -186,8 +190,12 @@ void witness::assign_data(reader& source, bool prefix) NOEXCEPT { while (!source.is_exhausted()) { + // If read_bytes_raw returns nullptr invalid source is implied. const auto size = source.read_size(max_block_weight); const auto bytes = source.read_bytes_raw(size); + if (is_null(bytes)) + break; + stack_.emplace_back(POINTER(data_chunk, allocator, bytes)); size_ = element_size(size_, stack_.back()); }