From: Philip Pronin <philipp@fb.com>
Date: Tue, 10 Sep 2013 13:21:36 +0000 (-0700)
Subject: fix heap-buffer-overflow (asan) in EliasFanoCoding
X-Git-Tag: v0.22.0~882
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3c40a0b6246afe8bdb225b4eaa79d862cdcad6b4;p=folly.git

fix heap-buffer-overflow (asan) in EliasFanoCoding

Test Plan:
fbconfig folly/experimental/test:elias_fano_test && fbmake runtests_opt

Reviewed By: tudorb@fb.com

FB internal diff: D962971
---

diff --git a/folly/experimental/EliasFanoCoding.h b/folly/experimental/EliasFanoCoding.h
index d6232b2d..74955617 100644
--- a/folly/experimental/EliasFanoCoding.h
+++ b/folly/experimental/EliasFanoCoding.h
@@ -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.