From f19cca13741e8d9cb44acfa0be0a313d3705cf29 Mon Sep 17 00:00:00 2001 From: arvidn Date: Wed, 11 Oct 2017 02:06:29 +0200 Subject: [PATCH] fix infinite loop when parsing certain invalid magnet links --- ChangeLog | 1 + src/magnet_uri.cpp | 6 ++---- test/test_magnet.cpp | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 74f5398a8..70329b552 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 1.1.5 release + * fix infinite loop when parsing certain invalid magnet links * fix parsing of torrents with certain invalid filenames * fix leak of torrent_peer objecs (entries in peer_list) * fix leak of peer_class objects (when setting per-torrent rate limits) diff --git a/src/magnet_uri.cpp b/src/magnet_uri.cpp index 4ea45fd13..095dc4049 100644 --- a/src/magnet_uri.cpp +++ b/src/magnet_uri.cpp @@ -194,8 +194,7 @@ namespace libtorrent { error_code e; url = unescape_string(url, e); - if (e) continue; - p.trackers.push_back(url); + if (!e) p.trackers.push_back(url); pos = uri.find("&tr=", pos); if (pos == std::string::npos) break; pos += 4; @@ -209,8 +208,7 @@ namespace libtorrent { error_code e; url = unescape_string(url, e); - if (e) continue; - p.url_seeds.push_back(url); + if (!e) p.url_seeds.push_back(url); pos = uri.find("&ws=", pos); if (pos == std::string::npos) break; pos += 4; diff --git a/test/test_magnet.cpp b/test/test_magnet.cpp index 30ded5f4d..8d3edabd5 100644 --- a/test/test_magnet.cpp +++ b/test/test_magnet.cpp @@ -410,3 +410,23 @@ TORRENT_TEST(trailing_whitespace) TEST_CHECK(h.is_valid()); } +TORRENT_TEST(invalid_tracker_escaping) +{ + add_torrent_params p; + p.save_path = "."; + error_code ec; + parse_magnet_uri("magnet:?tr=udp%3A%2F%2Ftracker.openjnt.com%\xf7" + "A80&tr=udp%3A%2F%2Ftracker.pub.ciltbcom%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80&xt=urn:btih:a38d02c287893842a39737aa866e00828aA80&xt=urn:buntu+11.04+%28Final%29" + , p, ec); + TEST_CHECK(ec); +} + +TORRENT_TEST(invalid_web_seed_escaping) +{ + add_torrent_params p; + p.save_path = "."; + error_code ec; + parse_magnet_uri("magnet:?ws=udp%3A%2F%2Ftracker.openjnt.com%\xf7" "A80", p, ec); + TEST_CHECK(ec); +} +