From a187d09bbf2b8178c37f0b766b456b234494ee94 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sat, 27 Apr 2013 21:11:12 +0000 Subject: [PATCH] merged make_magnet_uri fix from RC_0_16 --- ChangeLog | 1 + src/magnet_uri.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 39da328ed..fff739d60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,7 @@ * fix uTP edge case where udp socket buffer fills up * fix nagle implementation in uTP + * fix crash in make_magnet_uri when generating links longer than 1024 characters * fix hanging issue when closing files on windows (completing a download) * fix piece picking edge case that could cause torrents to get stuck at hash failure * try unencrypted connections first, and fall back to encryption if it fails (performance improvement) diff --git a/src/magnet_uri.cpp b/src/magnet_uri.cpp index 32a92145d..e54ba4b37 100644 --- a/src/magnet_uri.cpp +++ b/src/magnet_uri.cpp @@ -44,7 +44,7 @@ namespace libtorrent { if (!handle.is_valid()) return ""; - char ret[1024]; + char ret[2048]; sha1_hash const& ih = handle.info_hash(); int num_chars = snprintf(ret, sizeof(ret), "magnet:?xt=urn:btih:%s" , to_hex(ih.to_string()).c_str()); @@ -52,7 +52,7 @@ namespace libtorrent torrent_status st = handle.status(torrent_handle::query_name); std::string name = st.name; - if (!name.empty()) + if (!name.empty() && sizeof(ret) - 5 > num_chars) num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&dn=%s" , escape_string(name.c_str(), name.length()).c_str()); @@ -60,6 +60,7 @@ namespace libtorrent for (std::vector::const_iterator i = tr.begin(), end(tr.end()); i != end; ++i) { + if (num_chars >= sizeof(ret)) break; num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&tr=%s" , escape_string(i->url.c_str(), i->url.length()).c_str()); } @@ -69,20 +70,21 @@ namespace libtorrent std::string make_magnet_uri(torrent_info const& info) { - char ret[1024]; + char ret[2048]; sha1_hash const& ih = info.info_hash(); int num_chars = snprintf(ret, sizeof(ret), "magnet:?xt=urn:btih:%s" , to_hex(ih.to_string()).c_str()); std::string const& name = info.name(); - if (!name.empty()) + if (!name.empty() && sizeof(ret) - 5 > num_chars) num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&dn=%s" , escape_string(name.c_str(), name.length()).c_str()); std::vector const& tr = info.trackers(); for (std::vector::const_iterator i = tr.begin(), end(tr.end()); i != end; ++i) { + if (num_chars >= sizeof(ret)) break; num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&tr=%s" , escape_string(i->url.c_str(), i->url.length()).c_str()); }