]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Fix integer overflow in GetL0ThresholdSpeedupCompaction (#1378)
authorEdouard A <edouarda@users.noreply.github.com>
Mon, 24 Oct 2016 01:43:29 +0000 (18:43 -0700)
committeryiwu-arbug <yiwu@fb.com>
Mon, 24 Oct 2016 01:43:29 +0000 (18:43 -0700)
db/column_family.cc
port/win/io_win.h

index 2b048576c7ef30399599186250a8315137d51d3e..2197cb560af131338a44c942fd082fb570ef73ae 100644 (file)
@@ -542,14 +542,34 @@ int GetL0ThresholdSpeedupCompaction(int level0_file_num_compaction_trigger,
   // SanitizeOptions() ensures it.
   assert(level0_file_num_compaction_trigger <= level0_slowdown_writes_trigger);
 
+  if (level0_file_num_compaction_trigger < 0) {
+    return std::numeric_limits<int>::max();
+  }
+
+  const int twice_level0_trigger = level0_file_num_compaction_trigger * 2;
+
+  // overflow protection
+  if (twice_level0_trigger < 0) {
+    return std::numeric_limits<int>::max();
+  }
+
   // 1/4 of the way between L0 compaction trigger threshold and slowdown
   // condition.
+  const int one_fourth_trigger_slowdown =
+      level0_file_num_compaction_trigger +
+      ((level0_slowdown_writes_trigger - level0_file_num_compaction_trigger) /
+       4);
+
+  // overflow protection
+  if (one_fourth_trigger_slowdown < 0) {
+    return std::numeric_limits<int>::max();
+  }
+
+  assert(twice_level0_trigger >= 0);
+  assert(one_fourth_trigger_slowdown >= 0);
+
   // Or twice as compaction trigger, if it is smaller.
-  return std::min(level0_file_num_compaction_trigger * 2,
-                  level0_file_num_compaction_trigger +
-                      (level0_slowdown_writes_trigger -
-                       level0_file_num_compaction_trigger) /
-                          4);
+  return std::min(twice_level0_trigger, one_fourth_trigger_slowdown);
 }
 }  // namespace
 
index 42846e3227418fa1862be5305cc068a092bb34c2..6907aeef1c65e4b5b771e0cbd46743cd55d7db01 100644 (file)
@@ -26,7 +26,7 @@ namespace port {
 std::string GetWindowsErrSz(DWORD err);
 
 inline Status IOErrorFromWindowsError(const std::string& context, DWORD err) {
-  return (err == ERROR_HANDLE_DISK_FULL) ?
+  return ((err == ERROR_HANDLE_DISK_FULL) || (err == ERROR_DISK_FULL)) ?
       Status::NoSpace(context, GetWindowsErrSz(err)) :
       Status::IOError(context, GetWindowsErrSz(err));
 }