]> granicus.if.org Git - transmission/commitdiff
(trunk libT) #2489: tr_torrentSetAnnounceList() should check for invalid and duplicat...
authorCharles Kerr <charles@transmissionbt.com>
Sat, 10 Oct 2009 19:16:21 +0000 (19:16 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Sat, 10 Oct 2009 19:16:21 +0000 (19:16 +0000)
libtransmission/torrent.c
libtransmission/transmission.h

index 69dbe1b5a78f8656b87d7edab5af589efa66fda1..b1481247e33cc5b33abfda93b3f0db94d12b4dee 100644 (file)
@@ -2011,15 +2011,29 @@ tr_torrentGetMTimes( const tr_torrent * tor,
 ****
 ***/
 
-void
+tr_announce_list_err
 tr_torrentSetAnnounceList( tr_torrent *            tor,
                            const tr_tracker_info * trackers,
                            int                     trackerCount )
 {
+    int i, j;
     tr_benc metainfo;
 
     assert( tr_isTorrent( tor ) );
 
+    /* look for bad URLs */
+    for( i=0; i<trackerCount; ++i )
+        if( !tr_httpIsValidURL( trackers[i].announce ) )
+            return TR_ANNOUNCE_LIST_HAS_BAD;
+
+    /* look for duplicates */
+    for( i=0; i<trackerCount; ++i )
+        for( j=0; j<trackerCount; ++j )
+            if(    ( i != j )
+                && ( trackers[i].tier == trackers[j].tier)
+                && ( !strcmp( trackers[i].announce, trackers[j].announce ) ) )
+                    return TR_ANNOUNCE_LIST_HAS_DUPLICATES;
+
     /* save to the .torrent file */
     if( !tr_bencLoadFile( &metainfo, TR_FMT_BENC, tor->info.torrent ) )
     {
@@ -2068,6 +2082,8 @@ tr_torrentSetAnnounceList( tr_torrent *            tor,
         /* tell the announcer to reload this torrent's tracker list */
         tr_announcerResetTorrent( tor->session->announcer, tor );
     }
+
+    return TR_ANNOUNCE_LIST_OK;
 }
 
 /**
index e8563b3703b57059ee94191ce2b8e910691243d0..9390400245bc3437ff5f648b71dd2ebab6b22985 100644 (file)
@@ -1101,6 +1101,15 @@ typedef struct tr_tracker_info
 }
 tr_tracker_info;
 
+
+typedef enum
+{
+  TR_ANNOUNCE_LIST_OK,
+  TR_ANNOUNCE_LIST_HAS_DUPLICATES,
+  TR_ANNOUNCE_LIST_HAS_BAD
+}
+tr_announce_list_err;
+
 /**
  * @brief Modify a torrent's tracker list.
  *
@@ -1113,9 +1122,10 @@ tr_tracker_info;
  *                 libtransmission derives `scrape' from `announce'.
  * @param trackerCount size of the `trackers' array
  */
-void tr_torrentSetAnnounceList( tr_torrent *            torrent,
-                                const tr_tracker_info * trackers,
-                                int                     trackerCount );
+tr_announce_list_err
+tr_torrentSetAnnounceList( tr_torrent             * torrent,
+                           const tr_tracker_info  * trackers,
+                           int                      trackerCount );
 
 
 /**