diff --git a/libtransmission/peer-msgs.c b/libtransmission/peer-msgs.c index b1f143b03..337988965 100644 --- a/libtransmission/peer-msgs.c +++ b/libtransmission/peer-msgs.c @@ -1872,7 +1872,7 @@ fillOutputBuffer( tr_peermsgs * msgs, time_t now ) tr_bencInitDict( &tmp, 3 ); tr_bencDictAddInt( &tmp, "msg_type", METADATA_MSG_TYPE_DATA ); tr_bencDictAddInt( &tmp, "piece", piece ); - tr_bencDictAddInt( &tmp, "total_size", dataLen ); + tr_bencDictAddInt( &tmp, "total_size", msgs->torrent->infoDictLength ); payload = tr_bencToStr( &tmp, TR_FMT_BENC, &payloadLen ); tr_bencFree( &tmp ); diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c index 48f5bd871..d72180517 100644 --- a/libtransmission/torrent.c +++ b/libtransmission/torrent.c @@ -767,23 +767,31 @@ tr_torrent * tr_torrentNew( const tr_ctor * ctor, int * setmeError ) { - int err; tr_info tmpInfo; tr_torrent * tor = NULL; const tr_magnet_info * magnetInfo; + tr_session * session = tr_ctorGetSession( ctor ); assert( ctor != NULL ); - assert( tr_isSession( tr_ctorGetSession( ctor ) ) ); + assert( tr_isSession( session ) ); if( !tr_ctorGetMagnet( ctor, &magnetInfo ) ) { - tor = tr_new0( tr_torrent, 1 ); - tr_metainfoSetFromMagnet( &tor->info, magnetInfo ); - torrentInit( tor, ctor ); + if( tr_torrentFindFromHash( session, magnetInfo->hash ) != NULL ) + { + if( setmeError ) + *setmeError = TR_PARSE_DUPLICATE; + } + else + { + tor = tr_new0( tr_torrent, 1 ); + tr_metainfoSetFromMagnet( &tor->info, magnetInfo ); + torrentInit( tor, ctor ); + } } else { - err = tr_torrentParse( ctor, &tmpInfo ); + const int err = tr_torrentParse( ctor, &tmpInfo ); if( !err ) { tor = tr_new0( tr_torrent, 1 );