Ignore:
Timestamp:
Jan 22, 2009, 2:32:29 PM (13 years ago)
Author:
charles
Message:

(trunk libT) #1734: encrypted peers' outgoing RC4 stream can be corrupted by sending protocol messages out-of-order

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/peer-io.c

    r7760 r7770  
    650650void
    651651tr_peerIoWrite( tr_peerIo   * io,
    652                 const void  * writeme,
    653                 size_t        writemeLen,
    654                 int           isPieceData )
     652                const void  * bytes,
     653                size_t        byteCount,
     654                tr_bool       isPieceData )
    655655{
    656656    struct tr_datatype * datatype;
    657657
    658658    assert( tr_amInEventThread( io->session ) );
    659     dbgmsg( io, "adding %zu bytes into io->output", writemeLen );
     659    dbgmsg( io, "adding %zu bytes into io->output", byteCount );
    660660
    661661    datatype = tr_new( struct tr_datatype, 1 );
    662662    datatype->isPieceData = isPieceData != 0;
    663     datatype->length = writemeLen;
     663    datatype->length = byteCount;
    664664
    665665    __tr_list_init( &datatype->head );
    666666    __tr_list_append( &io->outbuf_datatypes, &datatype->head );
    667667
    668     evbuffer_add( io->outbuf, writeme, writemeLen );
    669 }
    670 
    671 void
    672 tr_peerIoWriteBuf( tr_peerIo         * io,
    673                    struct evbuffer   * buf,
    674                    int                 isPieceData )
    675 {
    676     const size_t n = EVBUFFER_LENGTH( buf );
    677     tr_peerIoWrite( io, EVBUFFER_DATA( buf ), n, isPieceData );
    678     evbuffer_drain( buf, n );
    679 }
    680 
    681 /**
    682 ***
    683 **/
    684 
    685 void
    686 tr_peerIoWriteBytes( tr_peerIo       * io,
    687                      struct evbuffer * outbuf,
    688                      const void      * bytes,
    689                      size_t            byteCount )
    690 {
    691     uint8_t tmp[MAX_STACK_ARRAY_SIZE];
    692 
    693668    switch( io->encryptionMode )
    694669    {
    695         case PEER_ENCRYPTION_NONE:
    696             evbuffer_add( outbuf, bytes, byteCount );
    697             break;
    698 
    699         case PEER_ENCRYPTION_RC4: {
     670        case PEER_ENCRYPTION_RC4:
     671        {
     672            uint8_t tmp[MAX_STACK_ARRAY_SIZE];
    700673            const uint8_t * walk = bytes;
    701             evbuffer_expand( outbuf, byteCount );
    702             while( byteCount > 0 ) {
     674            evbuffer_expand( io->outbuf, byteCount );
     675            while( byteCount > 0 )
     676            {
    703677                const size_t thisPass = MIN( byteCount, sizeof( tmp ) );
    704678                tr_cryptoEncrypt( io->crypto, thisPass, walk, tmp );
    705                 evbuffer_add( outbuf, tmp, thisPass );
     679                evbuffer_add( io->outbuf, tmp, thisPass );
    706680                walk += thisPass;
    707681                byteCount -= thisPass;
     
    710684        }
    711685
     686        case PEER_ENCRYPTION_NONE:
     687            evbuffer_add( io->outbuf, bytes, byteCount );
     688            break;
     689
    712690        default:
    713691            assert( 0 );
    714     }
     692            break;
     693    }
     694}
     695
     696void
     697tr_peerIoWriteBuf( tr_peerIo         * io,
     698                   struct evbuffer   * buf,
     699                   tr_bool             isPieceData )
     700{
     701    const size_t n = EVBUFFER_LENGTH( buf );
     702    tr_peerIoWrite( io, EVBUFFER_DATA( buf ), n, isPieceData );
     703    evbuffer_drain( buf, n );
    715704}
    716705
Note: See TracChangeset for help on using the changeset viewer.