]> granicus.if.org Git - transmission/commitdiff
(trunk, libt) #4932 'crash on magnet links' -- fixed.
authorJordan Lee <jordan@transmissionbt.com>
Wed, 19 Sep 2012 05:11:19 +0000 (05:11 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Wed, 19 Sep 2012 05:11:19 +0000 (05:11 +0000)
libtransmission/completion.c
libtransmission/peer-msgs.c
libtransmission/rpcimpl.c

index c0538c43933ea73aff791ca20e09a6c6e6f492ab..77a9015ec470f6754c800e19781c62eaed2f209e 100644 (file)
@@ -271,8 +271,12 @@ void *
 tr_cpCreatePieceBitfield( const tr_completion * cp, size_t * byte_count )
 {
     void * ret;
+    tr_piece_index_t n;
     tr_bitfield pieces;
-    const tr_piece_index_t n = cp->tor->info.pieceCount;
+
+    assert( tr_torrentHasMetadata( cp->tor ) );
+
+    n = cp->tor->info.pieceCount;
     tr_bitfieldConstruct( &pieces, n );
 
     if( tr_cpHasAll( cp ) )
index 2895e460eb5e38f691b145e7906831b9af6f3277..fb91164c5420e4224f5cf94ed5c1e8e3a19051e8 100644 (file)
@@ -1984,10 +1984,13 @@ gotError( tr_peerIo * io UNUSED, short what, void * vmsgs )
 static void
 sendBitfield( tr_peermsgs * msgs )
 {
+    void * bytes;
     size_t byte_count = 0;
     struct evbuffer * out = msgs->outMessages;
-    void * bytes = tr_cpCreatePieceBitfield( &msgs->torrent->completion, &byte_count );
 
+    assert( tr_torrentHasMetadata( msgs->torrent ) );
+
+    bytes = tr_cpCreatePieceBitfield( &msgs->torrent->completion, &byte_count );
     evbuffer_add_uint32( out, sizeof( uint8_t ) + byte_count );
     evbuffer_add_uint8 ( out, BT_BITFIELD );
     evbuffer_add       ( out, bytes, byte_count );
index 2404276dee99b040fb8431415822f4fd77fc5a5c..34ec3b72d9c02ede2dbcac3b92f85fb42101914e 100644 (file)
@@ -652,12 +652,16 @@ addField( const tr_torrent * const tor,
     else if( tr_streq( key, keylen, "peersSendingToUs" ) )
         tr_bencDictAddInt( d, key, st->peersSendingToUs );
     else if( tr_streq( key, keylen, "pieces" ) ) {
-        size_t byte_count = 0;
-        void * bytes = tr_cpCreatePieceBitfield( &tor->completion, &byte_count );
-        char * str = tr_base64_encode( bytes, byte_count, NULL );
-        tr_bencDictAddStr( d, key, str!=NULL ? str : "" );
-        tr_free( str );
-        tr_free( bytes );
+        if (tr_torrentHasMetadata( tor ) ) {
+            size_t byte_count = 0;
+            void * bytes = tr_cpCreatePieceBitfield( &tor->completion, &byte_count );
+            char * str = tr_base64_encode( bytes, byte_count, NULL );
+            tr_bencDictAddStr( d, key, str!=NULL ? str : "" );
+            tr_free( str );
+            tr_free( bytes );
+        } else {
+            tr_bencDictAddStr( d, key, "" );
+        }
     }
     else if( tr_streq( key, keylen, "pieceCount" ) )
         tr_bencDictAddInt( d, key, inf->pieceCount );