From a982c96518b294ecabf0d39c266094b994b031ef Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 13 Feb 2023 19:51:23 -0600 Subject: [PATCH] fix: assertion failed leftUntilDone <= sizeWhenDone (#4879) --- libtransmission/completion.cc | 23 +++++++++++++++++++---- libtransmission/completion.h | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libtransmission/completion.cc b/libtransmission/completion.cc index 8ecd68fc2..63c08c75e 100644 --- a/libtransmission/completion.cc +++ b/libtransmission/completion.cc @@ -156,13 +156,28 @@ void tr_completion::addPiece(tr_piece_index_t piece) } } +void tr_completion::removeBlock(tr_block_index_t block) +{ + if (!hasBlock(block)) + { + return; // already didn't have it + } + + blocks_.unset(block); + size_now_ -= block_info_->blockSize(block); + + size_when_done_.reset(); + has_valid_.reset(); +} + void tr_completion::removePiece(tr_piece_index_t piece) { auto const [begin, end] = block_info_->blockSpanForPiece(piece); - size_now_ -= countHasBytesInPiece(piece); - size_when_done_.reset(); - has_valid_.reset(); - blocks_.unsetSpan(begin, end); + + for (auto block = begin; block < end; ++block) + { + removeBlock(block); + } } uint64_t tr_completion::countHasBytesInSpan(tr_byte_span_t span) const diff --git a/libtransmission/completion.h b/libtransmission/completion.h index d14e5d4b8..4afdd094e 100644 --- a/libtransmission/completion.h +++ b/libtransmission/completion.h @@ -172,6 +172,8 @@ private: return countHasBytesInSpan(block_info_->byteSpanForPiece(piece)); } + void removeBlock(tr_block_index_t block); + torrent_view const* tor_; tr_block_info const* block_info_;