mirror of
https://github.com/transmission/transmission
synced 2025-03-04 10:38:13 +00:00
#653 "overflow issue in Transmission/1.01" (1) safeguard bitfield functions against overflow. (2) add regression tests to see if this data is corrupted again in the future.
This commit is contained in:
parent
2085aec390
commit
f32d3b24fe
2 changed files with 20 additions and 6 deletions
|
@ -151,7 +151,8 @@ const tr_bitfield * tr_cpPieceBitfield( const tr_completion * cp )
|
||||||
return cp->pieceBitfield;
|
return cp->pieceBitfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tr_cpPieceAdd( tr_completion * cp, int piece )
|
void
|
||||||
|
tr_cpPieceAdd( tr_completion * cp, int piece )
|
||||||
{
|
{
|
||||||
const tr_torrent * tor = cp->tor;
|
const tr_torrent * tor = cp->tor;
|
||||||
const int start = tr_torPieceFirstBlock(tor,piece);
|
const int start = tr_torPieceFirstBlock(tor,piece);
|
||||||
|
@ -162,7 +163,8 @@ void tr_cpPieceAdd( tr_completion * cp, int piece )
|
||||||
tr_cpBlockAdd( cp, i );
|
tr_cpBlockAdd( cp, i );
|
||||||
}
|
}
|
||||||
|
|
||||||
void tr_cpPieceRem( tr_completion * cp, int piece )
|
void
|
||||||
|
tr_cpPieceRem( tr_completion * cp, int piece )
|
||||||
{
|
{
|
||||||
const tr_torrent * tor = cp->tor;
|
const tr_torrent * tor = cp->tor;
|
||||||
const int start = tr_torPieceFirstBlock(tor,piece);
|
const int start = tr_torPieceFirstBlock(tor,piece);
|
||||||
|
@ -189,6 +191,10 @@ void tr_cpPieceRem( tr_completion * cp, int piece )
|
||||||
cp->completeBlocks[piece] = 0;
|
cp->completeBlocks[piece] = 0;
|
||||||
tr_bitfieldRemRange ( cp->blockBitfield, start, end );
|
tr_bitfieldRemRange ( cp->blockBitfield, start, end );
|
||||||
tr_bitfieldRem( cp->pieceBitfield, piece );
|
tr_bitfieldRem( cp->pieceBitfield, piece );
|
||||||
|
|
||||||
|
assert( cp->completeHave <= tor->info.totalSize );
|
||||||
|
assert( cp->doneHave <= tor->info.totalSize );
|
||||||
|
assert( cp->doneHave <= cp->completeHave );
|
||||||
}
|
}
|
||||||
|
|
||||||
int tr_cpBlockIsComplete( const tr_completion * cp, int block )
|
int tr_cpBlockIsComplete( const tr_completion * cp, int block )
|
||||||
|
@ -218,6 +224,10 @@ tr_cpBlockAdd( tr_completion * cp, int block )
|
||||||
if( !tor->info.pieces[piece].dnd )
|
if( !tor->info.pieces[piece].dnd )
|
||||||
cp->doneHave += blockSize;
|
cp->doneHave += blockSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert( cp->completeHave <= tor->info.totalSize );
|
||||||
|
assert( cp->doneHave <= tor->info.totalSize );
|
||||||
|
assert( cp->doneHave <= cp->completeHave );
|
||||||
}
|
}
|
||||||
|
|
||||||
const tr_bitfield * tr_cpBlockBitfield( const tr_completion * cp )
|
const tr_bitfield * tr_cpBlockBitfield( const tr_completion * cp )
|
||||||
|
@ -262,6 +272,8 @@ tr_cpPercentComplete ( const tr_completion * cp )
|
||||||
uint64_t
|
uint64_t
|
||||||
tr_cpLeftUntilComplete ( const tr_completion * cp )
|
tr_cpLeftUntilComplete ( const tr_completion * cp )
|
||||||
{
|
{
|
||||||
|
assert( cp->tor->info.totalSize >= cp->completeHave );
|
||||||
|
|
||||||
return cp->tor->info.totalSize - cp->completeHave;
|
return cp->tor->info.totalSize - cp->completeHave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +296,9 @@ tr_cpLeftUntilDone ( const tr_completion * cp )
|
||||||
cp_status_t
|
cp_status_t
|
||||||
tr_cpGetStatus ( const tr_completion * cp )
|
tr_cpGetStatus ( const tr_completion * cp )
|
||||||
{
|
{
|
||||||
if( cp->completeHave >= cp->tor->info.totalSize )
|
assert( cp->tor->info.totalSize >= cp->completeHave );
|
||||||
|
|
||||||
|
if( cp->completeHave == cp->tor->info.totalSize )
|
||||||
return TR_CP_COMPLETE;
|
return TR_CP_COMPLETE;
|
||||||
|
|
||||||
tr_cpEnsureDoneValid( cp );
|
tr_cpEnsureDoneValid( cp );
|
||||||
|
|
|
@ -647,7 +647,7 @@ tr_bitfieldClear( tr_bitfield * bitfield )
|
||||||
int
|
int
|
||||||
tr_bitfieldIsEmpty( const tr_bitfield * bitfield )
|
tr_bitfieldIsEmpty( const tr_bitfield * bitfield )
|
||||||
{
|
{
|
||||||
unsigned int i;
|
size_t i;
|
||||||
|
|
||||||
for( i=0; i<bitfield->len; ++i )
|
for( i=0; i<bitfield->len; ++i )
|
||||||
if( bitfield->bits[i] )
|
if( bitfield->bits[i] )
|
||||||
|
@ -677,7 +677,7 @@ tr_bitfieldAddRange( tr_bitfield * bitfield,
|
||||||
size_t end )
|
size_t end )
|
||||||
{
|
{
|
||||||
/* TODO: there are faster ways to do this */
|
/* TODO: there are faster ways to do this */
|
||||||
unsigned int i;
|
size_t i;
|
||||||
for( i=begin; i<end; ++i )
|
for( i=begin; i<end; ++i )
|
||||||
tr_bitfieldAdd( bitfield, i );
|
tr_bitfieldAdd( bitfield, i );
|
||||||
}
|
}
|
||||||
|
@ -700,7 +700,7 @@ tr_bitfieldRemRange ( tr_bitfield * b,
|
||||||
size_t end )
|
size_t end )
|
||||||
{
|
{
|
||||||
/* TODO: there are faster ways to do this */
|
/* TODO: there are faster ways to do this */
|
||||||
unsigned int i;
|
size_t i;
|
||||||
for( i=begin; i<end; ++i )
|
for( i=begin; i<end; ++i )
|
||||||
tr_bitfieldRem( b, i );
|
tr_bitfieldRem( b, i );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue