mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
util: bitmap: clarify virBitmapLastSetBit() behavior for empty bitmaps
Before the variable 'bits' was initialized with 0 (commit
3470cd860d
), the following bug was
possible.
A function call with an empty bitmap leads to undefined
behavior. Because if 'bitmap->map_len == 0' 'unusedBits' will be <= 0
and 'sz == 1'. So the non global and non static variable 'bits' would
have never been set. Consequently the check 'bits == 0' results in
undefined behavior.
This patch clarifies the current version of the function by handling the
empty bitmap explicitly. Also, for an empty bitmap there is obviously no
bit set so we can just return -1 (indicating no bit set) right away. The
explicit check for 'bits == 0' after the loop is unnecessary because we
only get to this point if no set bit was found.
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Reviewed-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.vnet.ibm.com>
This commit is contained in:
parent
843a70a822
commit
7cd01a248b
@ -952,7 +952,11 @@ virBitmapLastSetBit(virBitmapPtr bitmap)
|
||||
ssize_t i;
|
||||
int unusedBits;
|
||||
ssize_t sz;
|
||||
unsigned long bits = 0;
|
||||
unsigned long bits;
|
||||
|
||||
/* If bitmap is empty then there is no set bit */
|
||||
if (bitmap->map_len == 0)
|
||||
return -1;
|
||||
|
||||
unusedBits = bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT - bitmap->max_bit;
|
||||
|
||||
@ -971,8 +975,8 @@ virBitmapLastSetBit(virBitmapPtr bitmap)
|
||||
goto found;
|
||||
}
|
||||
|
||||
if (bits == 0)
|
||||
return -1;
|
||||
/* Only reached if no set bit was found */
|
||||
return -1;
|
||||
|
||||
found:
|
||||
for (i = VIR_BITMAP_BITS_PER_UNIT - 1; i >= 0; i--) {
|
||||
|
Loading…
Reference in New Issue
Block a user