From 37cbdb331ecf90969c63f5a0107454056c1ef61e Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sun, 22 Mar 2009 22:24:11 +0000 Subject: [PATCH] IPv6 only tracker fix --- ChangeLog | 2 ++ src/http_tracker_connection.cpp | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 86d3b68f6..ce4fba09e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -49,6 +49,8 @@ release 0.14.3 * fixed missing include in enum_if.cpp * fixed dual IP stack issue * fixed issue where renamed files were sometimes not saved in resume data + * accepts tracker responses with no 'peers' field, as long as 'peers6' + is present release 0.14.2 diff --git a/src/http_tracker_connection.cpp b/src/http_tracker_connection.cpp index b6fd393af..c5d0af598 100644 --- a/src/http_tracker_connection.cpp +++ b/src/http_tracker_connection.cpp @@ -393,13 +393,7 @@ namespace libtorrent } entry const* peers_ent = e.find_key("peers"); - if (peers_ent == 0) - { - fail(-1, "missing 'peers' entry in tracker response"); - return; - } - - if (peers_ent->type() == entry::string_t) + if (peers_ent && peers_ent->type() == entry::string_t) { std::string const& peers = peers_ent->string(); for (std::string::const_iterator i = peers.begin(); @@ -416,7 +410,7 @@ namespace libtorrent peer_list.push_back(p); } } - else if (peers_ent->type() == entry::list_t) + else if (peers_ent && peers_ent->type() == entry::list_t) { entry::list_type const& l = peers_ent->list(); for(entry::list_type::const_iterator i = l.begin(); i != l.end(); ++i) @@ -428,8 +422,7 @@ namespace libtorrent } else { - fail(-1, "invalid 'peers' entry in tracker response"); - return; + peers_ent = 0; } entry const* ipv6_peers = e.find_key("peers6"); @@ -450,6 +443,17 @@ namespace libtorrent peer_list.push_back(p); } } + else + { + ipv6_peers = 0; + } + + if (peers_ent == 0 && ipv6_peers == 0) + { + fail(-1, "missing 'peers' and 'peers6' entry in tracker response"); + return; + } + // look for optional scrape info int complete = -1;