diff --git a/src/misc/block.c b/src/misc/block.c index a0301dcf0367e3e06e37c5f852531ac70b6d9e8e..a3b57cace50cc508c2c66ae6adef30802d5f4502 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -141,6 +141,19 @@ void block_Release(block_t *block) block->cbs->free(block); } +static block_t *block_ReallocDup( block_t *p_block, ssize_t i_prebody, size_t requested ) +{ + block_t *p_rea = block_Alloc( requested ); + if( p_rea == NULL ) + return NULL; + + if( p_block->i_buffer > 0 ) + memcpy( p_rea->p_buffer + i_prebody, p_block->p_buffer, p_block->i_buffer ); + BlockMetaCopy( p_rea, p_block ); + block_Release( p_block ); + return p_rea; +} + block_t *block_TryRealloc (block_t *p_block, ssize_t i_prebody, size_t i_body) { block_Check( p_block ); @@ -187,13 +200,7 @@ block_t *block_TryRealloc (block_t *p_block, ssize_t i_prebody, size_t i_body) } /* Not enough room: allocate a new buffer */ - block_t *p_rea = block_Alloc( requested ); - if( p_rea == NULL ) - return NULL; - - BlockMetaCopy( p_rea, p_block ); - block_Release( p_block ); - return p_rea; + return block_ReallocDup( p_block, i_prebody, requested ); } uint8_t *p_start = p_block->p_start; @@ -203,17 +210,7 @@ block_t *block_TryRealloc (block_t *p_block, ssize_t i_prebody, size_t i_body) assert( i_prebody >= 0 ); if( (size_t)(p_block->p_buffer - p_start) < (size_t)i_prebody || (size_t)(p_end - p_block->p_buffer) < i_body ) - { - block_t *p_rea = block_Alloc( requested ); - if( p_rea == NULL ) - return NULL; - - memcpy( p_rea->p_buffer + i_prebody, p_block->p_buffer, - p_block->i_buffer ); - BlockMetaCopy( p_rea, p_block ); - block_Release( p_block ); - return p_rea; - } + return block_ReallocDup( p_block, i_prebody, requested ); /* Third, expand payload */