mirror of https://github.com/aria2/aria2
Fixed the bug that peer is marked as seeder whenever it sends
extension handshake with metadata size. Peer must be marked as seeder only when client has not got metadata yet. This bug causes aria2 shutdowns connection early when it gets have message from a peer because it wrongly recognizes the peer as seeder.pull/1/head
parent
e818f9c8a5
commit
d429943d05
|
@ -111,42 +111,38 @@ void HandshakeExtensionMessage::doReceivedAction()
|
|||
const std::map<std::string, uint8_t>::value_type& vt = *itr;
|
||||
peer_->setExtension(vt.first, vt.second);
|
||||
}
|
||||
SharedHandle<TorrentAttribute> attrs =
|
||||
bittorrent::getTorrentAttrs(dctx_);
|
||||
if(attrs->metadata.empty() && !peer_->getExtensionMessageID("ut_metadata")) {
|
||||
// TODO In metadataGetMode, if peer don't support metadata
|
||||
// transfer, should we drop connection? There is a possibility
|
||||
// that peer can still tell us peers using PEX.
|
||||
throw DL_ABORT_EX("Peer doesn't support ut_metadata extension. Goodbye.");
|
||||
}
|
||||
if(metadataSize_ > 0) {
|
||||
if(attrs->metadataSize) {
|
||||
if(metadataSize_ != attrs->metadataSize) {
|
||||
throw DL_ABORT_EX("Wrong metadata_size. Which one is correct!?");
|
||||
SharedHandle<TorrentAttribute> attrs = bittorrent::getTorrentAttrs(dctx_);
|
||||
if(attrs->metadata.empty()) {
|
||||
if(!peer_->getExtensionMessageID("ut_metadata")) {
|
||||
// TODO In metadataGetMode, if peer don't support metadata
|
||||
// transfer, should we drop connection? There is a possibility
|
||||
// that peer can still tell us peers using PEX.
|
||||
throw DL_ABORT_EX("Peer doesn't support ut_metadata extension. Goodbye.");
|
||||
}
|
||||
if(metadataSize_ > 0) {
|
||||
if(attrs->metadataSize) {
|
||||
if(metadataSize_ != attrs->metadataSize) {
|
||||
throw DL_ABORT_EX("Wrong metadata_size. Which one is correct!?");
|
||||
}
|
||||
} else {
|
||||
attrs->metadataSize = metadataSize_;
|
||||
dctx_->getFirstFileEntry()->setLength(metadataSize_);
|
||||
dctx_->markTotalLengthIsKnown();
|
||||
dctx_->getOwnerRequestGroup()->initPieceStorage();
|
||||
|
||||
SharedHandle<PieceStorage> pieceStorage =
|
||||
dctx_->getOwnerRequestGroup()->getPieceStorage();
|
||||
// We enter 'end game' mode from the start to get metadata
|
||||
// quickly.
|
||||
pieceStorage->enterEndGame();
|
||||
}
|
||||
if(!peer_->isSeeder()) {
|
||||
peer_->reconfigureSessionResource(dctx_->getPieceLength(),
|
||||
dctx_->getTotalLength());
|
||||
peer_->setAllBitfield();
|
||||
}
|
||||
} else {
|
||||
attrs->metadataSize = metadataSize_;
|
||||
dctx_->getFirstFileEntry()->setLength(metadataSize_);
|
||||
dctx_->markTotalLengthIsKnown();
|
||||
dctx_->getOwnerRequestGroup()->initPieceStorage();
|
||||
|
||||
SharedHandle<PieceStorage> pieceStorage =
|
||||
dctx_->getOwnerRequestGroup()->getPieceStorage();
|
||||
// We enter 'end game' mode from the start to get metadata
|
||||
// quickly.
|
||||
pieceStorage->enterEndGame();
|
||||
peer_->reconfigureSessionResource(dctx_->getPieceLength(),
|
||||
dctx_->getTotalLength());
|
||||
peer_->setAllBitfield();
|
||||
} else {
|
||||
throw DL_ABORT_EX("Peer didn't provide metadata_size."
|
||||
" It seems that it doesn't have whole metadata.");
|
||||
}
|
||||
} else if(attrs->metadata.empty()) {
|
||||
throw DL_ABORT_EX("Peer didn't provide metadata_size."
|
||||
" It seems that it doesn't have whole metadata.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -79,6 +79,7 @@ void Peer::allocateSessionResource(size_t pieceLength, uint64_t totalLength)
|
|||
delete res_;
|
||||
res_ = new PeerSessionResource(pieceLength, totalLength);
|
||||
res_->getPeerStat().downloadStart();
|
||||
updateSeeder();
|
||||
}
|
||||
|
||||
void Peer::reconfigureSessionResource(size_t pieceLength, uint64_t totalLength)
|
||||
|
|
|
@ -117,9 +117,17 @@ void HandshakeExtensionMessageTest::testDoReceivedAction()
|
|||
CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->getPort());
|
||||
CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex"));
|
||||
CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht"));
|
||||
CPPUNIT_ASSERT(peer->isSeeder());
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)1024, attrs->metadataSize);
|
||||
CPPUNIT_ASSERT_EQUAL((uint64_t)1024, dctx->getTotalLength());
|
||||
CPPUNIT_ASSERT(dctx->knowsTotalLength());
|
||||
|
||||
// See Peer is not marked as seeder if !attrs->metadata.empty()
|
||||
peer->allocateSessionResource(1024, 1024*1024);
|
||||
attrs->metadataSize = 1024;
|
||||
attrs->metadata = std::string('0', attrs->metadataSize);
|
||||
msg.doReceivedAction();
|
||||
CPPUNIT_ASSERT(!peer->isSeeder());
|
||||
}
|
||||
|
||||
void HandshakeExtensionMessageTest::testCreate()
|
||||
|
|
Loading…
Reference in New Issue