Changeset 6468


Ignore:
Timestamp:
Aug 10, 2008, 2:58:11 PM (13 years ago)
Author:
charles
Message:

#1168: reading past the end of KTorrent's pex added.f strings

Location:
trunk/libtransmission
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/bencode.c

    r6425 r6468  
    469469    return found;
    470470}
     471
     472int
     473tr_bencDictFindRaw( tr_benc         * dict,
     474                    const char      * key,
     475                    const uint8_t  ** setme_raw,
     476                    size_t          * setme_len )
     477{
     478    int found = FALSE;
     479    tr_benc * child = tr_bencDictFindType( dict, key, TYPE_STR );
     480    if( child ) {
     481        *setme_raw = (uint8_t*) child->val.s.s;
     482        *setme_len = child->val.s.i;
     483        found = TRUE;
     484    }
     485    return found;
     486}
     487
    471488
    472489/***
  • trunk/libtransmission/bencode.h

    r6224 r6468  
    7272int       tr_bencDictFindDouble( tr_benc * dict, const char * key, double * setme );
    7373int       tr_bencDictFindStr( tr_benc * dict, const char * key, const char ** setme );
     74int       tr_bencDictFindRaw( tr_benc * dict, const char * key, const uint8_t ** setme_raw,
     75                                                                size_t * setme_len );
    7476int       tr_bencDictFindList( tr_benc * dict, const char * key, tr_benc ** setme );
    7577int       tr_bencDictFindDict( tr_benc * dict, const char * key, tr_benc ** setme );
  • trunk/libtransmission/peer-mgr.c

    r6467 r6468  
    10711071
    10721072tr_pex *
    1073 tr_peerMgrCompactToPex( const void  * compact,
    1074                         size_t        compactLen,
    1075                         const char  * added_f,
    1076                         size_t      * pexCount )
     1073tr_peerMgrCompactToPex( const void     * compact,
     1074                        size_t           compactLen,
     1075                        const uint8_t  * added_f,
     1076                        size_t           added_f_len,
     1077                        size_t         * pexCount )
    10771078{
    10781079    size_t i;
    10791080    size_t n = compactLen / 6;
    10801081    const uint8_t * walk = compact;
    1081     const size_t flen = added_f ? strlen( added_f ) : 0;
    10821082    tr_pex * pex = tr_new0( tr_pex, n );
    1083 
    1084 #if 0
    1085 if( added_f && strlen(added_f)!=n )
    1086 {
    1087     int i;
    1088     const int len = strlen( added_f );
    1089     fprintf( stderr, "compactLen is %d, n is %d, and strlen(added_f) is %d!!!\n", (int)compactLen, (int)n, len );
    1090     for( i=0; i<len; ++i )
    1091         fprintf( stderr, "added.f[%d] is %d\n", i, (int)added_f[i] );
    1092 }
    1093 #endif
    10941083
    10951084    for( i=0; i<n; ++i ) {
    10961085        memcpy( &pex[i].in_addr, walk, 4 ); walk += 4;
    10971086        memcpy( &pex[i].port, walk, 2 ); walk += 2;
    1098         if( added_f && ( n == flen ) )
     1087        if( added_f && ( n == added_f_len ) )
    10991088            pex[i].flags = added_f[i];
    11001089    }
     1090
    11011091    *pexCount = n;
    11021092    return pex;
  • trunk/libtransmission/peer-mgr.h

    r6115 r6468  
    6060                            int               socket );
    6161
    62 tr_pex * tr_peerMgrCompactToPex( const void  * compact,
    63                                  size_t        compactLen,
    64                                  const char  * added_f,
    65                                  size_t      * pexCount );
     62tr_pex * tr_peerMgrCompactToPex( const void     * compact,
     63                                 size_t           compactLen,
     64                                 const uint8_t  * added_f,
     65                                 size_t           added_f_len,
     66                                 size_t         * setme_pex_count );
    6667                             
    6768void tr_peerMgrAddPex( tr_peerMgr     * manager,
  • trunk/libtransmission/peer-msgs.c

    r6425 r6468  
    10221022        && (( added = tr_bencDictFindType( &val, "added", TYPE_STR ))))
    10231023    {
    1024         const char * added_f = NULL;
     1024        const uint8_t * added_f = NULL;
    10251025        tr_pex * pex;
    10261026        size_t i, n;
    1027         tr_bencDictFindStr( &val, "added.f", &added_f );
    1028         pex = tr_peerMgrCompactToPex( added->val.s.s, added->val.s.i, added_f, &n );
     1027        size_t added_f_len = 0;
     1028        tr_bencDictFindRaw( &val, "added.f", &added_f, &added_f_len );
     1029        pex = tr_peerMgrCompactToPex( added->val.s.s, added->val.s.i, added_f, added_f_len, &n );
    10291030        for( i=0; i<n; ++i )
    10301031            tr_peerMgrAddPex( msgs->handle->peerMgr, tor->info.hash,
  • trunk/libtransmission/torrent.c

    r6435 r6468  
    188188            tr_pex * pex = tr_peerMgrCompactToPex( event->compact,
    189189                                                   event->compactLen,
    190                                                    NULL, &n );
     190                                                   NULL, 0, &n );
    191191            if( event->allAreSeeds )
    192192                tr_tordbg( tor, "Got %d seeds from tracker", (int)n );
Note: See TracChangeset for help on using the changeset viewer.