From a9085db760694096c7bfcd50f234da10631cd720 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sat, 13 Jan 2018 14:36:13 +0100 Subject: [PATCH] fix error handling of merkle torrents --- ChangeLog | 1 + src/torrent_info.cpp | 11 +++++++++-- test/Makefile.am | 1 + test/test_torrent_info.cpp | 1 + test/test_torrents/invalid_merkle.torrent | 1 + 5 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test/test_torrents/invalid_merkle.torrent diff --git a/ChangeLog b/ChangeLog index 82868fdf5..fe3b3960e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ + * fix error handling of some merkle torrents * fix error handling of unsupported hard-links 1.1.6 release diff --git a/src/torrent_info.cpp b/src/torrent_info.cpp index 8deb076af..ed7cb1383 100644 --- a/src/torrent_info.cpp +++ b/src/torrent_info.cpp @@ -1258,8 +1258,15 @@ namespace libtorrent m_files.set_piece_length(0); return false; } - int num_leafs = merkle_num_leafs(files.num_pieces()); - int num_nodes = merkle_num_nodes(num_leafs); + if (files.num_pieces() <= 0) + { + ec = errors::no_files_in_torrent; + // mark the torrent as invalid + m_files.set_piece_length(0); + return false; + } + int const num_leafs = merkle_num_leafs(files.num_pieces()); + int const num_nodes = merkle_num_nodes(num_leafs); if (num_nodes - num_leafs >= (2<<24)) { ec = errors::too_many_pieces_in_torrent; diff --git a/test/Makefile.am b/test/Makefile.am index 7aab670e1..f59eb55d3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -70,6 +70,7 @@ EXTRA_DIST = Jamfile \ test_torrents/httpseed.torrent \ test_torrents/invalid_file_size.torrent \ test_torrents/invalid_info.torrent \ + test_torrents/invalid_merkle.torrent \ test_torrents/invalid_name.torrent \ test_torrents/invalid_name2.torrent \ test_torrents/invalid_name3.torrent \ diff --git a/test/test_torrent_info.cpp b/test/test_torrent_info.cpp index 37ce96379..fc0847118 100644 --- a/test/test_torrent_info.cpp +++ b/test/test_torrent_info.cpp @@ -161,6 +161,7 @@ test_failing_torrent_t test_error_torrents[] = { "unaligned_pieces.torrent", errors::torrent_invalid_hashes }, { "invalid_root_hash.torrent", errors::torrent_invalid_hashes }, { "invalid_root_hash2.torrent", errors::torrent_missing_pieces }, + { "invalid_merkle.torrent", errors::no_files_in_torrent}, { "invalid_file_size.torrent", errors::torrent_invalid_length }, { "invalid_symlink.torrent", errors::torrent_invalid_name }, }; diff --git a/test/test_torrents/invalid_merkle.torrent b/test/test_torrents/invalid_merkle.torrent new file mode 100644 index 000000000..ec555de9d --- /dev/null +++ b/test/test_torrents/invalid_merkle.torrent @@ -0,0 +1 @@ +d10:cion datei15992e4:infod6:lengthi000e4:name4:temp12:piece lengthi12e9:root hash20:‚ž¼Œ&¾ÇJW›}ÜA4u,·¼‘‡ee