Ignore:
Timestamp:
Mar 3, 2009, 8:06:45 PM (13 years ago)
Author:
charles
Message:

(trunk libT) when a "torrent-set" request is sent to change files' priorities and/or download flags, and some of the file indices are out-of-range, return an error message in the rpc response's "result" string.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/rpcimpl.c

    r7992 r8006  
    535535***/
    536536
    537 static void
     537static const char*
    538538setFilePriorities( tr_torrent * tor,
    539539                   int          priority,
    540540                   tr_benc *    list )
    541541{
    542     int               i;
    543     int64_t           tmp;
    544     int               fileCount = 0;
    545     const int         n = tr_bencListSize( list );
     542    int i;
     543    int64_t tmp;
     544    int fileCount = 0;
     545    const int n = tr_bencListSize( list );
     546    const char * errmsg = NULL;
    546547    tr_file_index_t * files = tr_new0( tr_file_index_t, tor->info.fileCount );
    547548
    548549    if( n )
    549550    {
    550         for( i = 0; i < n; ++i )
    551             if( tr_bencGetInt( tr_bencListChild( list, i ), &tmp ) )
    552                 if( 0 <= tmp && tmp < tor->info.fileCount )
     551        for( i = 0; i < n; ++i ) {
     552            if( tr_bencGetInt( tr_bencListChild( list, i ), &tmp ) ) {
     553                if( 0 <= tmp && tmp < tor->info.fileCount ) {
    553554                    files[fileCount++] = tmp;
     555                } else {
     556                    errmsg = "file index out of range";
     557                }
     558            }
     559        }
    554560    }
    555561    else /* if empty set, apply to all */
     
    564570
    565571    tr_free( files );
    566 }
    567 
    568 static void
     572    return errmsg;
     573}
     574
     575static const char*
    569576setFileDLs( tr_torrent * tor,
    570577            int          do_download,
    571578            tr_benc *    list )
    572579{
    573     int               i;
    574     int64_t           tmp;
    575     int               fileCount = 0;
    576     const int         n = tr_bencListSize( list );
     580    int i;
     581    int64_t tmp;
     582    int fileCount = 0;
     583    const int n = tr_bencListSize( list );
     584    const char * errmsg = NULL;
    577585    tr_file_index_t * files = tr_new0( tr_file_index_t, tor->info.fileCount );
    578586
    579587    if( n ) /* if argument list, process them */
    580588    {
    581         for( i = 0; i < n; ++i )
    582             if( tr_bencGetInt( tr_bencListChild( list, i ), &tmp ) )
    583                 if( 0 <= tmp && tmp < tor->info.fileCount )
     589        for( i = 0; i < n; ++i ) {
     590            if( tr_bencGetInt( tr_bencListChild( list, i ), &tmp ) ) {
     591                if( 0 <= tmp && tmp < tor->info.fileCount ) {
    584592                    files[fileCount++] = tmp;
     593                } else {
     594                    errmsg = "file index out of range";
     595                }
     596            }
     597        }
    585598    }
    586599    else /* if empty set, apply to all */
     
    595608
    596609    tr_free( files );
     610    return errmsg;
    597611}
    598612
     
    603617            struct tr_rpc_idle_data  * idle_data )
    604618{
    605     int           i, torrentCount;
     619    const char * errmsg = NULL;
     620    int i, torrentCount;
    606621    tr_torrent ** torrents = getTorrents( session, args_in, &torrentCount );
    607622
     
    621636        if( tr_bencDictFindInt( args_in, "peer-limit", &tmp ) )
    622637            tr_torrentSetPeerLimit( tor, tmp );
    623         if( tr_bencDictFindList( args_in, "priority-high", &files ) )
    624             setFilePriorities( tor, TR_PRI_HIGH, files );
    625         if( tr_bencDictFindList( args_in, "priority-low", &files ) )
    626             setFilePriorities( tor, TR_PRI_LOW, files );
    627         if( tr_bencDictFindList( args_in, "priority-normal", &files ) )
    628             setFilePriorities( tor, TR_PRI_NORMAL, files );
     638        if( !errmsg &&  tr_bencDictFindList( args_in, "priority-high", &files ) )
     639            errmsg = setFilePriorities( tor, TR_PRI_HIGH, files );
     640        if( !errmsg && tr_bencDictFindList( args_in, "priority-low", &files ) )
     641            errmsg = setFilePriorities( tor, TR_PRI_LOW, files );
     642        if( !errmsg && tr_bencDictFindList( args_in, "priority-normal", &files ) )
     643            errmsg = setFilePriorities( tor, TR_PRI_NORMAL, files );
    629644        if( tr_bencDictFindInt( args_in, "speed-limit-down", &tmp ) )
    630645            tr_torrentSetSpeedLimit( tor, TR_DOWN, tmp );
     
    646661
    647662    tr_free( torrents );
    648     return NULL;
     663    return errmsg;
    649664}
    650665
Note: See TracChangeset for help on using the changeset viewer.