fix heap-buffer-overflow (asan) in EliasFanoCoding
authorPhilip Pronin <philipp@fb.com>
Tue, 10 Sep 2013 13:21:36 +0000 (06:21 -0700)
committerJordan DeLong <jdelong@fb.com>
Sun, 22 Sep 2013 23:39:36 +0000 (16:39 -0700)
Test Plan:
fbconfig folly/experimental/test:elias_fano_test && fbmake runtests_opt

Reviewed By: tudorb@fb.com

FB internal diff: D962971

folly/experimental/EliasFanoCoding.h

index d6232b2df62605a8df4c873f7ead86508712fd90..749556174d2d8bf35792951ac356981946cafd3d 100644 (file)
@@ -132,12 +132,14 @@ struct EliasFanoCompressedList {
 
     // *** Lower bits.
     const size_t lowerSize = (numLowerBits * size + 7) / 8;
-    unsigned char* const lower =
-      static_cast<unsigned char*>(calloc(lowerSize + 7, 1));
-    const ValueType lowerMask = (ValueType(1) << numLowerBits) - 1;
-    for (size_t i = 0; i < size; ++i) {
-      const ValueType lowerBits = list[i] & lowerMask;
-      writeBits56(lower, i * numLowerBits, numLowerBits, lowerBits);
+    unsigned char* lower = nullptr;
+    if (lowerSize > 0) {  // numLowerBits != 0
+      lower = static_cast<unsigned char*>(calloc(lowerSize + 7, 1));
+      const ValueType lowerMask = (ValueType(1) << numLowerBits) - 1;
+      for (size_t i = 0; i < size; ++i) {
+        const ValueType lowerBits = list[i] & lowerMask;
+        writeBits56(lower, i * numLowerBits, numLowerBits, lowerBits);
+      }
     }
 
     // *** Upper bits.