iterators are not (necessarily) pointers. use data() instead of begin() on span

This commit is contained in:
arvidn 2018-11-26 02:25:35 +01:00 committed by Arvid Norberg
parent 0808b96ec7
commit e80506d3b3
2 changed files with 33 additions and 34 deletions

View File

@ -165,14 +165,14 @@ namespace aux {
inline bool operator==(span<T> const& lhs, span<U> const& rhs) inline bool operator==(span<T> const& lhs, span<U> const& rhs)
{ {
return lhs.size() == rhs.size() return lhs.size() == rhs.size()
&& (lhs.begin() == rhs.begin() || std::equal(lhs.begin(), lhs.end(), rhs.begin())); && (lhs.data() == rhs.data() || std::equal(lhs.begin(), lhs.end(), rhs.begin()));
} }
template <class T, class U> template <class T, class U>
inline bool operator!=(span<T> const& lhs, span<U> const& rhs) inline bool operator!=(span<T> const& lhs, span<U> const& rhs)
{ {
return lhs.size() != rhs.size() return lhs.size() != rhs.size()
|| (lhs.begin() != rhs.begin() && !std::equal(lhs.begin(), lhs.end(), rhs.begin())); || (lhs.data() != rhs.data() && !std::equal(lhs.begin(), lhs.end(), rhs.begin()));
} }
} }

View File

@ -759,7 +759,7 @@ namespace {
|| recv_buffer[0] != msg_piece) || recv_buffer[0] != msg_piece)
return piece_block_progress(); return piece_block_progress();
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
peer_request r; peer_request r;
r.piece = piece_index_t(detail::read_int32(ptr)); r.piece = piece_index_t(detail::read_int32(ptr));
r.start = detail::read_int32(ptr); r.start = detail::read_int32(ptr);
@ -920,7 +920,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
piece_index_t const index(detail::read_int32(ptr)); piece_index_t const index(detail::read_int32(ptr));
incoming_have(index); incoming_have(index);
@ -954,7 +954,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
typed_bitfield<piece_index_t> bits; typed_bitfield<piece_index_t> bits;
bits.assign(recv_buffer.begin() + 1 bits.assign(recv_buffer.data() + 1
, t->valid_metadata()?get_bitfield().size():(m_recv_buffer.packet_size()-1)*CHAR_BIT); , t->valid_metadata()?get_bitfield().size():(m_recv_buffer.packet_size()-1)*CHAR_BIT);
incoming_bitfield(bits); incoming_bitfield(bits);
@ -980,7 +980,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
peer_request r; peer_request r;
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
r.piece = piece_index_t(detail::read_int32(ptr)); r.piece = piece_index_t(detail::read_int32(ptr));
r.start = detail::read_int32(ptr); r.start = detail::read_int32(ptr);
r.length = detail::read_int32(ptr); r.length = detail::read_int32(ptr);
@ -999,7 +999,7 @@ namespace {
TORRENT_ASSERT(received >= 0); TORRENT_ASSERT(received >= 0);
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
int const recv_pos = m_recv_buffer.pos(); // recv_buffer.end - recv_buffer.begin; int const recv_pos = m_recv_buffer.pos();
std::shared_ptr<torrent> t = associated_torrent().lock(); std::shared_ptr<torrent> t = associated_torrent().lock();
TORRENT_ASSERT(t); TORRENT_ASSERT(t);
@ -1016,7 +1016,7 @@ namespace {
received_bytes(0, received); received_bytes(0, received);
return; return;
} }
char const* ptr = recv_buffer.begin() + 9; char const* ptr = recv_buffer.data() + 9;
int const list_size = detail::read_int32(ptr); int const list_size = detail::read_int32(ptr);
if (list_size > m_recv_buffer.packet_size() - 13) if (list_size > m_recv_buffer.packet_size() - 13)
@ -1053,7 +1053,7 @@ namespace {
if (recv_pos >= header_size) if (recv_pos >= header_size)
{ {
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
p.piece = piece_index_t(detail::read_int32(ptr)); p.piece = piece_index_t(detail::read_int32(ptr));
p.start = detail::read_int32(ptr); p.start = detail::read_int32(ptr);
@ -1122,10 +1122,10 @@ namespace {
peer_log(peer_log_alert::incoming_message, "HASHPIECE" peer_log(peer_log_alert::incoming_message, "HASHPIECE"
, "piece: %d list: %d", static_cast<int>(p.piece), list_size); , "piece: %d list: %d", static_cast<int>(p.piece), list_size);
#endif #endif
bdecode_node hash_list;
error_code ec; error_code ec;
if (bdecode(recv_buffer.begin() + 13, recv_buffer.begin() + 13 + list_size bdecode_node const hash_list = bdecode(recv_buffer.subspan(13).first(list_size)
, hash_list, ec) != 0) , ec);
if (ec)
{ {
disconnect(errors::invalid_hash_piece, operation_t::bittorrent, peer_error); disconnect(errors::invalid_hash_piece, operation_t::bittorrent, peer_error);
return; return;
@ -1159,7 +1159,7 @@ namespace {
} }
} }
incoming_piece(p, recv_buffer.begin() + header_size); incoming_piece(p, recv_buffer.data() + header_size);
} }
// ----------------------------- // -----------------------------
@ -1182,7 +1182,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
peer_request r; peer_request r;
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
r.piece = piece_index_t(detail::read_int32(ptr)); r.piece = piece_index_t(detail::read_int32(ptr));
r.start = detail::read_int32(ptr); r.start = detail::read_int32(ptr);
r.length = detail::read_int32(ptr); r.length = detail::read_int32(ptr);
@ -1209,7 +1209,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
int const listen_port = detail::read_uint16(ptr); int const listen_port = detail::read_uint16(ptr);
incoming_dht_port(listen_port); incoming_dht_port(listen_port);
@ -1236,7 +1236,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
piece_index_t const piece(detail::read_int32(ptr)); piece_index_t const piece(detail::read_int32(ptr));
incoming_suggest(piece); incoming_suggest(piece);
} }
@ -1283,7 +1283,7 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
peer_request r; peer_request r;
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
r.piece = piece_index_t(detail::read_int32(ptr)); r.piece = piece_index_t(detail::read_int32(ptr));
r.start = detail::read_int32(ptr); r.start = detail::read_int32(ptr);
r.length = detail::read_int32(ptr); r.length = detail::read_int32(ptr);
@ -1304,7 +1304,7 @@ namespace {
if (!m_recv_buffer.packet_finished()) return; if (!m_recv_buffer.packet_finished()) return;
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
const char* ptr = recv_buffer.begin() + 1; const char* ptr = recv_buffer.data() + 1;
piece_index_t const index(detail::read_int32(ptr)); piece_index_t const index(detail::read_int32(ptr));
incoming_allowed_fast(index); incoming_allowed_fast(index);
@ -1331,7 +1331,7 @@ namespace {
TORRENT_ASSERT(recv_buffer.front() == holepunch_msg); TORRENT_ASSERT(recv_buffer.front() == holepunch_msg);
recv_buffer = recv_buffer.subspan(1); recv_buffer = recv_buffer.subspan(1);
const char* ptr = recv_buffer.begin(); const char* ptr = recv_buffer.data();
// ignore invalid messages // ignore invalid messages
if (int(recv_buffer.size()) < 2) return; if (int(recv_buffer.size()) < 2) return;
@ -1663,11 +1663,10 @@ namespace {
span<char const> recv_buffer = m_recv_buffer.get(); span<char const> recv_buffer = m_recv_buffer.get();
bdecode_node root;
error_code ec; error_code ec;
int pos; int pos;
int ret = bdecode(recv_buffer.begin() + 2, recv_buffer.end(), root, ec, &pos); bdecode_node root = bdecode(recv_buffer.subspan(2), ec, &pos);
if (ret != 0 || ec || root.type() != bdecode_node::dict_t) if (ec || root.type() != bdecode_node::dict_t)
{ {
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
if (should_log(peer_log_alert::info)) if (should_log(peer_log_alert::info))
@ -2421,7 +2420,7 @@ namespace {
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(m_recv_buffer.packet_size() == dh_key_len); TORRENT_ASSERT(m_recv_buffer.packet_size() == dh_key_len);
TORRENT_ASSERT(recv_buffer.begin() == m_recv_buffer.get().begin()); TORRENT_ASSERT(recv_buffer.data() == m_recv_buffer.get().data());
TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size()); TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size());
if (!m_recv_buffer.packet_finished()) return; if (!m_recv_buffer.packet_finished()) return;
@ -2433,7 +2432,7 @@ namespace {
// read dh key, generate shared secret // read dh key, generate shared secret
m_dh_key_exchange->compute_secret( m_dh_key_exchange->compute_secret(
reinterpret_cast<std::uint8_t const*>(recv_buffer.begin())); reinterpret_cast<std::uint8_t const*>(recv_buffer.data()));
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
peer_log(peer_log_alert::info, "ENCRYPTION", "received DH key"); peer_log(peer_log_alert::info, "ENCRYPTION", "received DH key");
@ -2479,7 +2478,7 @@ namespace {
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(!is_outgoing()); TORRENT_ASSERT(!is_outgoing());
TORRENT_ASSERT(recv_buffer.begin() == m_recv_buffer.get().begin()); TORRENT_ASSERT(recv_buffer.data() == m_recv_buffer.get().data());
TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size()); TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size());
if (int(recv_buffer.size()) < 20) if (int(recv_buffer.size()) < 20)
@ -2575,7 +2574,7 @@ namespace {
TORRENT_ASSERT(!is_disconnecting()); TORRENT_ASSERT(!is_disconnecting());
sha1_hash ih(recv_buffer.begin()); sha1_hash ih(recv_buffer.data());
torrent const* ti = m_ses.find_encrypted_torrent(ih, m_dh_key_exchange->get_hash_xor_mask()); torrent const* ti = m_ses.find_encrypted_torrent(ih, m_dh_key_exchange->get_hash_xor_mask());
if (ti) if (ti)
@ -2627,7 +2626,7 @@ namespace {
TORRENT_ASSERT(is_outgoing()); TORRENT_ASSERT(is_outgoing());
TORRENT_ASSERT(!m_encrypted); TORRENT_ASSERT(!m_encrypted);
TORRENT_ASSERT(!m_rc4_encrypted); TORRENT_ASSERT(!m_rc4_encrypted);
TORRENT_ASSERT(recv_buffer.begin() == m_recv_buffer.get().begin()); TORRENT_ASSERT(recv_buffer.data() == m_recv_buffer.get().data());
TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size()); TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size());
if (int(recv_buffer.size()) < 8) if (int(recv_buffer.size()) < 8)
@ -2941,11 +2940,11 @@ namespace {
if (!m_recv_buffer.packet_finished()) return; if (!m_recv_buffer.packet_finished()) return;
recv_buffer = m_recv_buffer.get(); recv_buffer = m_recv_buffer.get();
int packet_size = recv_buffer[0]; int const packet_size = recv_buffer[0];
static const char protocol_string[] = "\x13" "BitTorrent protocol"; static const char protocol_string[] = "\x13" "BitTorrent protocol";
if (packet_size != 19 || if (packet_size != 19 ||
std::memcmp(recv_buffer.begin(), protocol_string, 20) != 0) recv_buffer.first(20) != span<char const>{protocol_string, 20})
{ {
#if !defined TORRENT_DISABLE_ENCRYPTION #if !defined TORRENT_DISABLE_ENCRYPTION
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
@ -3047,7 +3046,7 @@ namespace {
} }
#endif #endif
std::memcpy(m_reserved_bits.data(), recv_buffer.begin(), 8); std::memcpy(m_reserved_bits.data(), recv_buffer.data(), 8);
if (recv_buffer[5] & 0x10) if (recv_buffer[5] & 0x10)
m_supports_extensions = true; m_supports_extensions = true;
@ -3133,7 +3132,7 @@ namespace {
ascii_pid[i] = (is_print(recv_buffer[i])) ? recv_buffer[i] : '.'; ascii_pid[i] = (is_print(recv_buffer[i])) ? recv_buffer[i] : '.';
peer_log(peer_log_alert::incoming, "HANDSHAKE", "received peer_id: %s client: %s ascii: \"%s\"" peer_log(peer_log_alert::incoming, "HANDSHAKE", "received peer_id: %s client: %s ascii: \"%s\""
, hex_pid, identify_client(peer_id(recv_buffer.begin())).c_str(), ascii_pid); , hex_pid, identify_client(peer_id(recv_buffer.data())).c_str(), ascii_pid);
} }
#endif #endif
peer_id pid; peer_id pid;
@ -3248,7 +3247,7 @@ namespace {
if (m_state == state_t::read_packet_size) if (m_state == state_t::read_packet_size)
{ {
// Make sure this is not fallen though into // Make sure this is not fallen though into
TORRENT_ASSERT(recv_buffer.begin() == m_recv_buffer.get().begin()); TORRENT_ASSERT(recv_buffer.data() == m_recv_buffer.get().data());
TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size()); TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size());
TORRENT_ASSERT(m_recv_buffer.packet_size() == 5); TORRENT_ASSERT(m_recv_buffer.packet_size() == 5);
@ -3265,7 +3264,7 @@ namespace {
TORRENT_ASSERT(bytes_transferred <= 1); TORRENT_ASSERT(bytes_transferred <= 1);
const char* ptr = recv_buffer.begin(); const char* ptr = recv_buffer.data();
int const packet_size = detail::read_int32(ptr); int const packet_size = detail::read_int32(ptr);
// don't accept packets larger than 1 MB // don't accept packets larger than 1 MB
@ -3299,7 +3298,7 @@ namespace {
if (m_state == state_t::read_packet) if (m_state == state_t::read_packet)
{ {
TORRENT_ASSERT(recv_buffer.begin() == m_recv_buffer.get().begin()); TORRENT_ASSERT(recv_buffer.data() == m_recv_buffer.get().data());
TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size()); TORRENT_ASSERT(recv_buffer.size() == m_recv_buffer.get().size());
if (!t) if (!t)
{ {