I missed a corner case here: when the next range ends right at the end
of the bitset, we need to return immediately to avoid trying to search
after the bitset. And when finding the next end, we similarly need to
bail if the range is size 1 at the very end of the range. In practice
this probably would'nt have been noticed, because it would break out of
the loop anyway, but I happened to be running something using this under
Valgrind and it complained.
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10076>
* 0-bit after the range.
*/
unsigned word = BITSET_BITWORD(*end);
+ if (word >= BITSET_WORDS(size)) {
+ *start = *end = size;
+ return;
+ }
BITSET_WORD tmp = set[word] & ~(BITSET_BIT(*end) - 1);
while (!tmp) {
word++;
* 0-bit.
*/
word = BITSET_BITWORD(*start + 1);
+ if (word >= BITSET_WORDS(size)) {
+ *end = size;
+ return;
+ }
tmp = set[word] | (BITSET_BIT(*start + 1) - 1);
while (~tmp == 0) {
word++;