Correct logic errors in bitmask_set and extend initial/increment size to reduce likelihood of any risk of realloc failure.
This commit is contained in:
@ -109,13 +109,13 @@ bitmask_set(GWBITMASK *bitmask, int bit)
|
|||||||
unsigned char mask;
|
unsigned char mask;
|
||||||
|
|
||||||
spinlock_acquire(&bitmask->lock);
|
spinlock_acquire(&bitmask->lock);
|
||||||
if (bit >= bitmask->length)
|
while (bit >= bitmask->length)
|
||||||
{
|
{
|
||||||
bitmask->bits = realloc(bitmask->bits,
|
bitmask->bits = realloc(bitmask->bits,
|
||||||
(bitmask->length + BIT_LENGTH_INC) / 8);
|
(bitmask->length + BIT_LENGTH_INC) / 8);
|
||||||
memset(bitmask->bits + (bitmask->length / 8), 0,
|
memset(bitmask->bits + (bitmask->length / 8), 0,
|
||||||
BIT_LENGTH_INC / 8);
|
BIT_LENGTH_INC / 8);
|
||||||
bitmask->length += (BIT_LENGTH_INC / 8);
|
bitmask->length += BIT_LENGTH_INC;
|
||||||
}
|
}
|
||||||
ptr = bitmask->bits + (bit / 8);
|
ptr = bitmask->bits + (bit / 8);
|
||||||
mask = 1 << (bit % 8);
|
mask = 1 << (bit % 8);
|
||||||
|
|||||||
@ -33,8 +33,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Both these numbers MUST be exact multiples of 8 */
|
/* Both these numbers MUST be exact multiples of 8 */
|
||||||
#define BIT_LENGTH_INITIAL 32 /**< Initial number of bits in the bitmask */
|
#define BIT_LENGTH_INITIAL 256 /**< Initial number of bits in the bitmask */
|
||||||
#define BIT_LENGTH_INC 32 /**< Number of bits to add on each increment */
|
#define BIT_LENGTH_INC 256 /**< Number of bits to add on each increment */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The bitmask structure used to store an arbitrary large bitmask
|
* The bitmask structure used to store an arbitrary large bitmask
|
||||||
|
|||||||
Reference in New Issue
Block a user