Browse Source

HADOOP-13202. Avoid possible overflow in org.apache.hadoop.util.bloom.BloomFilter#getNBytes. Contributed by Kai Sasaki.

(cherry picked from commit c2bcffb34ebe4399b523a44f69d23761648bd0c4)
(cherry picked from commit 09375baad1ba732b73701cdbd0ee77618ed6f687)
Akira Ajisaka 8 years ago
parent
commit
cf79ac5fa9

+ 1 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/bloom/BloomFilter.java

@@ -234,6 +234,6 @@ public class BloomFilter extends Filter {
   
   /* @return number of bytes needed to hold bit vector */
   private int getNBytes() {
-    return (vectorSize + 7) / 8;
+    return (int)(((long)vectorSize + 7) / 8);
   }
 }//end class

+ 12 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/bloom/TestBloomFilters.java

@@ -239,6 +239,18 @@ public class TestBloomFilters {
                 BloomFilterTestStrategy.FILTER_XOR_STRATEGY)).test();
   }
 
+  @Test
+  public void testFiltersWithLargeVectorSize() {
+    int hashId = Hash.MURMUR_HASH;
+    Filter filter
+        = new BloomFilter(Integer.MAX_VALUE, hashFunctionNumber, hashId);
+    BloomFilterCommonTester.of(hashId, numInsertions)
+        .withFilterInstance(filter)
+        .withTestCases(ImmutableSet.of(
+                BloomFilterTestStrategy.WRITE_READ_STRATEGY
+        )).test();
+  }
+
   @Test
   public void testNot() {
     BloomFilter bf = new BloomFilter(8, 1, Hash.JENKINS_HASH);