Ignore:
Timestamp:
Mar 5, 2007, 11:03:38 PM (15 years ago)
Author:
joshe
Message:

Do bounds checking on bitfields.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/peer.c

    r1452 r1534  
    3939struct tr_peer_s
    4040{
    41     tr_torrent_t   * tor;
    42 
    43     struct in_addr addr;
    44     in_port_t      port;  /* peer's listening port, 0 if not known */
    45 
    46 #define PEER_STATUS_IDLE       1 /* Need to connect */
    47 #define PEER_STATUS_CONNECTING 2 /* Trying to send handshake */
    48 #define PEER_STATUS_HANDSHAKE  4 /* Waiting for peer's handshake */
    49 #define PEER_STATUS_CONNECTED  8 /* Got peer's handshake */
    50     int            status;
    51     int            socket;
    52     char           incoming;
    53     uint64_t       date;
    54     uint64_t       keepAlive;
    55 
    56     char           amChoking;
    57     char           amInterested;
    58     char           peerChoking;
    59     char           peerInterested;
    60 
    61     int            optimistic;
    62     uint64_t       lastChoke;
    63 
    64     uint8_t        id[20];
     41    tr_torrent_t      * tor;
     42
     43    struct in_addr      addr;
     44    in_port_t           port;  /* peer's listening port, 0 if not known */
     45
     46#define PEER_STATUS_IDLE        1 /* Need to connect */
     47#define PEER_STATUS_CONNECTING  2 /* Trying to send handshake */
     48#define PEER_STATUS_HANDSHAKE   4 /* Waiting for peer's handshake */
     49#define PEER_STATUS_CONNECTED   8 /* Got peer's handshake */
     50    int                 status;
     51    int                 socket;
     52    char                incoming;
     53    uint64_t            date;
     54    uint64_t            keepAlive;
     55
     56    char                amChoking;
     57    char                amInterested;
     58    char                peerChoking;
     59    char                peerInterested;
     60
     61    int                 optimistic;
     62    uint64_t            lastChoke;
     63
     64    uint8_t             id[20];
    6565
    6666    /* The pieces that the peer has */
    67     uint8_t      * bitfield;
    68     int            pieceCount;
    69     float          progress;
    70 
    71     int            goodPcs;
    72     int            badPcs;
    73     int            banned;
     67    tr_bitfield_t     * bitfield;
     68    int                 pieceCount;
     69    float               progress;
     70
     71    int                 goodPcs;
     72    int                 badPcs;
     73    int                 banned;
    7474    /* The pieces that the peer is contributing to */
    75     uint8_t      * blamefield;
     75    tr_bitfield_t     * blamefield;
    7676    /* The bad pieces that the peer has contributed to */
    77     uint8_t      * banfield;
    78 
    79     uint8_t      * buf;
    80     int            size;
    81     int            pos;
    82 
    83     uint8_t      * outMessages;
    84     int            outMessagesSize;
    85     int            outMessagesPos;
    86     uint8_t        outBlock[13+16384];
    87     int            outBlockSize;
    88     int            outBlockLoaded;
    89     int            outBlockSending;
    90 
    91     int            inRequestCount;
    92     tr_request_t   inRequests[OUR_REQUEST_COUNT];
    93     int            inIndex;
    94     int            inBegin;
    95     int            inLength;
    96     uint64_t       inTotal;
    97 
    98     int            outRequestCount;
    99     tr_request_t   outRequests[MAX_REQUEST_COUNT];
    100     uint64_t       outTotal;
    101     uint64_t       outDate;
    102 
    103     tr_ratecontrol_t * download;
    104     tr_ratecontrol_t * upload;
     77    tr_bitfield_t     * banfield;
     78
     79    uint8_t           * buf;
     80    int                 size;
     81    int                 pos;
     82
     83    uint8_t           * outMessages;
     84    int                 outMessagesSize;
     85    int                 outMessagesPos;
     86    uint8_t             outBlock[13+16384];
     87    int                 outBlockSize;
     88    int                 outBlockLoaded;
     89    int                 outBlockSending;
     90
     91    int                 inRequestCount;
     92    tr_request_t        inRequests[OUR_REQUEST_COUNT];
     93    int                 inIndex;
     94    int                 inBegin;
     95    int                 inLength;
     96    uint64_t            inTotal;
     97
     98    int                 outRequestCount;
     99    tr_request_t        outRequests[MAX_REQUEST_COUNT];
     100    uint64_t            outTotal;
     101    uint64_t            outDate;
     102
     103    tr_ratecontrol_t  * download;
     104    tr_ratecontrol_t  * upload;
    105105};
    106106
     
    163163        tr_cpDownloaderRem( tor->completion, block );
    164164    }
    165     if( peer->bitfield )
    166     {
    167         free( peer->bitfield );
    168     }
    169     if( peer->blamefield )
    170     {
    171         free( peer->blamefield );
    172     }
    173     if( peer->banfield )
    174     {
    175         free( peer->banfield );
    176     }
     165    tr_bitfieldFree( peer->bitfield );
     166    tr_bitfieldFree( peer->blamefield );
     167    tr_bitfieldFree( peer->banfield );
    177168    if( peer->buf )
    178169    {
     
    533524 *
    534525 **********************************************************************/
    535 uint8_t * tr_peerBitfield( tr_peer_t * peer )
     526tr_bitfield_t * tr_peerBitfield( tr_peer_t * peer )
    536527{
    537528    return peer->bitfield;
     
    602593            /* Assume the peer wasn't responsible for the bad pieces
    603594               we was banned for */
    604             memset( peer->banfield, 0x00, ( tor->info.pieceCount + 7 ) / 8 );
     595            tr_bitfieldClear( peer->banfield );
    605596        }
    606597    }
     
    612603        if( !peer->banfield )
    613604        {
    614             peer->banfield = calloc( ( tor->info.pieceCount + 7 ) / 8, 1 );
     605            peer->banfield = tr_bitfieldNew( tor->info.pieceCount );
    615606        }
    616607        tr_bitfieldAdd( peer->banfield, piece );
Note: See TracChangeset for help on using the changeset viewer.