fix folly build under python 3
[folly.git] / folly / Varint.h
index 4ad1cc778a4cd3abd3f34a517ec7544ecc6ed2db..a58866fd10392b8f6dd2394db056977a5db61dc3 100644 (file)
@@ -17,7 +17,7 @@
 #ifndef FOLLY_VARINT_H_
 #define FOLLY_VARINT_H_
 
-#include "folly/Range.h"
+#include <folly/Range.h>
 
 namespace folly {
 
@@ -94,7 +94,8 @@ inline uint64_t decodeVarint(ByteRange& data) {
   const int8_t* p = begin;
   uint64_t val = 0;
 
-  if (LIKELY(end - begin >= kMaxVarintLength64)) {  // fast path
+  // end is always greater than or equal to begin, so this subtraction is safe
+  if (LIKELY(size_t(end - begin) >= kMaxVarintLength64)) {  // fast path
     int64_t b;
     do {
       b = *p++; val  = (b & 0x7f)      ; if (b >= 0) break;
@@ -107,7 +108,7 @@ inline uint64_t decodeVarint(ByteRange& data) {
       b = *p++; val |= (b & 0x7f) << 49; if (b >= 0) break;
       b = *p++; val |= (b & 0x7f) << 56; if (b >= 0) break;
       b = *p++; val |= (b & 0x7f) << 63; if (b >= 0) break;
-      throw std::invalid_argument("Invalid varint value");  // too big
+      throw std::invalid_argument("Invalid varint value. Too big.");
     } while (false);
   } else {
     int shift = 0;
@@ -115,7 +116,10 @@ inline uint64_t decodeVarint(ByteRange& data) {
       val |= static_cast<uint64_t>(*p++ & 0x7f) << shift;
       shift += 7;
     }
-    if (p == end) throw std::invalid_argument("Invalid varint value");
+    if (p == end) {
+      throw std::invalid_argument("Invalid varint value. Too small: " +
+                                  std::to_string(end - begin) + " bytes");
+    }
     val |= static_cast<uint64_t>(*p++) << shift;
   }
 
@@ -126,4 +130,3 @@ inline uint64_t decodeVarint(ByteRange& data) {
 }  // namespaces
 
 #endif /* FOLLY_VARINT_H_ */
-