]> granicus.if.org Git - transmission/commitdiff
#879: fix segfault if tracker is freed immediately after starting a torrent
authorCharles Kerr <charles@transmissionbt.com>
Tue, 15 Apr 2008 15:51:59 +0000 (15:51 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Tue, 15 Apr 2008 15:51:59 +0000 (15:51 +0000)
libtransmission/tracker.c

index aedc65c5a8a8ec0fcde3a77ae7567a0806da415c..13e0ade0478c9e63fd890c89c64a4df3234f1852 100644 (file)
@@ -1141,17 +1141,17 @@ onTrackerFreeNow( void * vt )
     tr_free( t );
 }
 
+/***
+****  PUBLIC
+***/
+
 void
 tr_trackerFree( tr_tracker * t )
 {
-    tr_runInEventThread( t->handle, onTrackerFreeNow, t );
+    if( t )
+        tr_runInEventThread( t->handle, onTrackerFreeNow, t );
 }
 
-
-/***
-****  PUBLIC
-***/
-
 tr_publisher_tag
 tr_trackerSubscribe( tr_tracker          * t,
                      tr_delivery_func      func,
@@ -1164,7 +1164,8 @@ void
 tr_trackerUnsubscribe( tr_tracker        * t,
                        tr_publisher_tag    tag )
 {
-    tr_publisherUnsubscribe( t->publisher, tag );
+    if( t )
+        tr_publisherUnsubscribe( t->publisher, tag );
 }
 
 const tr_tracker_info *
@@ -1206,12 +1207,15 @@ tr_trackerGetCounts( const tr_tracker  * t,
 void
 tr_trackerStart( tr_tracker * t )
 {
-    tr_free( t->peer_id );
-    t->peer_id = tr_peerIdNew( );
+    if( t )
+    {
+        tr_free( t->peer_id );
+        t->peer_id = tr_peerIdNew( );
 
-    if( t->isRunning == 0 ) {
-        t->isRunning = 1;
-        enqueueRequest( t->handle, t, TR_REQ_STARTED );
+        if( t->isRunning == 0 ) {
+            t->isRunning = 1;
+            enqueueRequest( t->handle, t, TR_REQ_STARTED );
+        }
     }
 }
 
@@ -1230,7 +1234,7 @@ tr_trackerCompleted( tr_tracker * t )
 void
 tr_trackerStop( tr_tracker * t )
 {
-    if( t->isRunning ) {
+    if( t && t->isRunning ) {
         t->isRunning = 0;
         t->reannounceAt = t->manualAnnounceAllowedAt = 0;
         enqueueRequest( t->handle, t, TR_REQ_STOPPED );