Browse Source

putil: fix crash in BitArray::has_any_of()

rdb 5 years ago
parent
commit
a9b158192f
2 changed files with 23 additions and 5 deletions
  1. 5 5
      panda/src/putil/bitArray.cxx
  2. 18 0
      tests/putil/test_bitarray.py

+ 5 - 5
panda/src/putil/bitArray.cxx

@@ -114,6 +114,11 @@ has_any_of(int low_bit, int size) const {
   ++w;
   ++w;
 
 
   while (size > 0) {
   while (size > 0) {
+    if ((size_t)w >= get_num_words()) {
+      // Now we're up to the highest bits.
+      return (_highest_bits != 0);
+    }
+
     if (size <= num_bits_per_word) {
     if (size <= num_bits_per_word) {
       // The remainder fits within one word of the array.
       // The remainder fits within one word of the array.
       return _array[w].has_any_of(0, size);
       return _array[w].has_any_of(0, size);
@@ -125,11 +130,6 @@ has_any_of(int low_bit, int size) const {
     }
     }
     size -= num_bits_per_word;
     size -= num_bits_per_word;
     ++w;
     ++w;
-
-    if (w >= (int)get_num_words()) {
-      // Now we're up to the highest bits.
-      return (_highest_bits != 0);
-    }
   }
   }
 
 
   return false;
   return false;

+ 18 - 0
tests/putil/test_bitarray.py

@@ -0,0 +1,18 @@
+from panda3d.core import BitArray
+
+
+def test_bitarray_has_any_of():
+    ba = BitArray()
+    assert not ba.has_any_of(100, 200)
+
+    ba = BitArray()
+    ba.set_range(0, 53)
+    assert ba.has_any_of(52, 1)
+    assert ba.has_any_of(52, 100)
+    assert not ba.has_any_of(53, 45)
+
+    ba = BitArray()
+    ba.invert_in_place()
+    assert ba.has_any_of(0, 1)
+    assert ba.has_any_of(53, 45)
+    assert ba.has_any_of(0, 100)