Changeset 9774


Ignore:
Timestamp:
Dec 15, 2009, 4:34:12 PM (12 years ago)
Author:
charles
Message:

(trunk libT) #2673 "crash in tr_torrentGetMetadataPiece" -- add safeguards against small sizes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/torrent-magnet.c

    r9772 r9774  
    108108        if( fp != NULL )
    109109        {
    110             const int offset = piece  * METADATA_PIECE_SIZE;
    111 
    112             if( !fseek( fp, tor->infoDictOffset + offset, SEEK_SET ) )
     110            const int o = piece  * METADATA_PIECE_SIZE;
     111
     112            if( !fseek( fp, tor->infoDictOffset + o, SEEK_SET ) )
    113113            {
    114                 const int l = offset + METADATA_PIECE_SIZE <= tor->infoDictLength
     114                const int l = o + METADATA_PIECE_SIZE <= tor->infoDictLength
    115115                            ? METADATA_PIECE_SIZE
    116                             : tor->infoDictLength - offset;
    117                 char * buf = tr_new( char, l );
    118                 const int n = fread( buf, 1, l, fp );
    119                 if( n != l )
     116                            : tor->infoDictLength - o;
     117
     118                if( 0<l && l<=METADATA_PIECE_SIZE )
    120119                {
    121                     *len = l;
    122                     ret = buf;
    123                     buf = NULL;
     120                    char * buf = tr_new( char, l );
     121                    const int n = fread( buf, 1, l, fp );
     122                    if( n == l )
     123                    {
     124                        *len = l;
     125                        ret = buf;
     126                        buf = NULL;
     127                    }
     128
     129                    tr_free( buf );
    124130                }
    125 
    126                 tr_free( buf );
    127131            }
    128132
Note: See TracChangeset for help on using the changeset viewer.