diff --git a/src/bdecode.cpp b/src/bdecode.cpp index d89a4b119..209bb39dc 100644 --- a/src/bdecode.cpp +++ b/src/bdecode.cpp @@ -109,6 +109,14 @@ namespace libtorrent // reading a key or a vale. 0 means key 1 is value std::uint32_t state:1; }; + + // diff between current and next item offset + // should only be called for non last item in array + int token_source_span(bdecode_token const& t) + { + return (&t)[1].offset - t.offset; + } + } // anonymous namespace @@ -193,7 +201,6 @@ namespace libtorrent } } - bdecode_node::bdecode_node() : m_root_tokens(nullptr) , m_buffer(nullptr) @@ -470,7 +477,7 @@ namespace libtorrent { TORRENT_ASSERT(type() == dict_t); - bdecode_token const* tokens = m_root_tokens; + bdecode_token const* const tokens = m_root_tokens; // this is the first item int token = m_token_idx + 1; @@ -479,7 +486,7 @@ namespace libtorrent { bdecode_token const& t = tokens[token]; TORRENT_ASSERT(t.type == bdecode_token::string); - int const size = m_root_tokens[token + 1].offset - t.offset - t.start_offset(); + int const size = token_source_span(t) - t.start_offset(); if (int(key.size()) == size && std::equal(key.data(), key.data() + size, m_buffer + t.offset + t.start_offset())) @@ -554,7 +561,7 @@ namespace libtorrent { TORRENT_ASSERT(type() == int_t); bdecode_token const& t = m_root_tokens[m_token_idx]; - int size = m_root_tokens[m_token_idx + 1].offset - t.offset; + int const size = token_source_span(t); TORRENT_ASSERT(t.type == bdecode_token::integer); // +1 is to skip the 'i' @@ -574,8 +581,7 @@ namespace libtorrent { TORRENT_ASSERT(type() == string_t); bdecode_token const& t = m_root_tokens[m_token_idx]; - std::size_t const size = m_root_tokens[m_token_idx + 1].offset - t.offset - - aux::numeric_cast(t.start_offset()); + std::size_t const size = aux::numeric_cast(token_source_span(t) - t.start_offset()); TORRENT_ASSERT(t.type == bdecode_token::string); return string_view(m_buffer + t.offset + t.start_offset(), size); @@ -594,7 +600,7 @@ namespace libtorrent TORRENT_ASSERT(type() == string_t); bdecode_token const& t = m_root_tokens[m_token_idx]; TORRENT_ASSERT(t.type == bdecode_token::string); - return m_root_tokens[m_token_idx + 1].offset - t.offset - t.start_offset(); + return token_source_span(t) - t.start_offset(); } void bdecode_node::reserve(int tokens)