diff --git a/libtorrent/src/torrent.cpp b/libtorrent/src/torrent.cpp index dd388de2b..0d1f1644e 100755 --- a/libtorrent/src/torrent.cpp +++ b/libtorrent/src/torrent.cpp @@ -875,7 +875,7 @@ namespace libtorrent #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) if (m_abort) { - boost::shared_ptr tl(new tracker_logger(m_ses)); + boost::shared_ptr tl(new aux::tracker_logger(m_ses)); m_ses.m_tracker_manager.queue_request(m_ses.m_io_service, m_ses.m_half_open, req , tracker_login(), m_ses.m_listen_interface.address(), tl); } @@ -4120,8 +4120,16 @@ namespace libtorrent piece_picker::block_info const* info = i->info; for (int k = 0; k < num_blocks; ++k) { + TORRENT_ASSERT(file != m_torrent_file->end_files()); TORRENT_ASSERT(offset == size_type(i->index) * m_torrent_file->piece_length() + k * m_block_size); + TORRENT_ASSERT(offset < m_torrent_file->total_size()); + while (offset >= file->offset + file->size) + { + ++file; + ++file_index; + } + TORRENT_ASSERT(file != m_torrent_file->end_files()); size_type block_size = m_block_size; @@ -4141,6 +4149,7 @@ namespace libtorrent = p->connection->downloading_piece_progress(); if (pbp && pbp->piece_index == i->index && pbp->block_index == k) block_size = pbp->bytes_downloaded; + TORRENT_ASSERT(block_size <= m_block_size); } if (block_size == 0) @@ -4150,28 +4159,40 @@ namespace libtorrent } } - if (offset + m_block_size > file->offset + file->size) + if (offset + block_size > file->offset + file->size) { int left_over = m_block_size - block_size; // split the block on multiple files - while (offset + block_size > file->offset + file->size) + while (block_size > 0) { TORRENT_ASSERT(offset <= file->offset + file->size); - size_type slice = file->offset + file->size - offset; + size_type slice = (std::min)(file->offset + file->size - offset + , block_size); fp[file_index] += slice; offset += slice; block_size -= slice; - ++file; - ++file_index; - if (file == m_torrent_file->end_files()) break; + TORRENT_ASSERT(offset <= file->offset + file->size); + if (offset == file->offset + file->size) + { + ++file; + ++file_index; + if (file == m_torrent_file->end_files()) + { + offset += block_size; + break; + } + } } offset += left_over; + TORRENT_ASSERT(offset == size_type(i->index) * m_torrent_file->piece_length() + + (k+1) * m_block_size); } else { fp[file_index] += block_size; offset += m_block_size; } + TORRENT_ASSERT(file_index <= m_torrent_file->num_files()); } } }