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