diff --git a/include/libp2p/basic/varint_prefix_reader.hpp b/include/libp2p/basic/varint_prefix_reader.hpp index 2f296b242..28eebc5b0 100644 --- a/include/libp2p/basic/varint_prefix_reader.hpp +++ b/include/libp2p/basic/varint_prefix_reader.hpp @@ -42,6 +42,10 @@ namespace libp2p::basic { return value_; } + size_t size() const { + return got_bytes_; + } + /// Resets reader's state void reset(); diff --git a/src/protocol_muxer/multiselect/parser.cpp b/src/protocol_muxer/multiselect/parser.cpp index 00dc186d8..8c9049a23 100644 --- a/src/protocol_muxer/multiselect/parser.cpp +++ b/src/protocol_muxer/multiselect/parser.cpp @@ -11,6 +11,7 @@ namespace libp2p::protocol_muxer::multiselect::detail { constexpr size_t kMaxRecursionDepth = 3; + constexpr size_t kMaxLenBytes = 2; size_t Parser::bytesNeeded() const { size_t n = 0; @@ -43,7 +44,15 @@ namespace libp2p::protocol_muxer::multiselect::detail { if (expected_msg_size_ == 0) { auto s = varint_reader_.consume(data); + if (varint_reader_.size() > kMaxLenBytes) { + state_ = kOverflow; + break; + } if (s == VarintPrefixReader::kUnderflow) { + if (varint_reader_.size() == kMaxLenBytes) { + state_ = kOverflow; + break; + } continue; } if (s != VarintPrefixReader::kReady) {