0

[net] Use ClampedNumeric<> when calculating cache size

Without clamped arithmetic scaled disk cache calculations could overflow
and result in a maximum cache size of zero.

Bug: 1262273
Change-Id: Ia608f6f716869cb6429c99133796db7cbc3780e8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3237070
Auto-Submit: Wez <wez@chromium.org>
Reviewed-by: Maksim Orlovich <morlovich@chromium.org>
Commit-Queue: Wez <wez@chromium.org>
Cr-Commit-Position: refs/heads/main@{#935932}
This commit is contained in:
Wez
2021-10-28 16:40:19 +00:00
committed by Chromium LUCI CQ
parent 4f829fae60
commit 0437ba62d2

@ -11,6 +11,7 @@
#include "base/files/file_util.h" #include "base/files/file_util.h"
#include "base/location.h" #include "base/location.h"
#include "base/metrics/field_trial_params.h" #include "base/metrics/field_trial_params.h"
#include "base/numerics/clamped_math.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
@ -174,12 +175,13 @@ int PreferredCacheSize(int64_t available, net::CacheType type) {
else if (percent_relative_size < 100) else if (percent_relative_size < 100)
percent_relative_size = 100; percent_relative_size = 100;
int64_t scaled_default_disk_cache_size = base::ClampedNumeric<int64_t> scaled_default_disk_cache_size =
(static_cast<int64_t>(disk_cache::kDefaultCacheSize) * (base::ClampedNumeric<int64_t>(disk_cache::kDefaultCacheSize) *
percent_relative_size) / percent_relative_size) /
100; 100;
int64_t preferred_cache_size = scaled_default_disk_cache_size; base::ClampedNumeric<int64_t> preferred_cache_size =
scaled_default_disk_cache_size;
// If available disk space is known, use it to compute a better value for // If available disk space is known, use it to compute a better value for
// preferred_cache_size. // preferred_cache_size.
@ -190,8 +192,10 @@ int PreferredCacheSize(int64_t available, net::CacheType type) {
// scale for the field trial, capping the scaled value at 20% of the // scale for the field trial, capping the scaled value at 20% of the
// available space. // available space.
if (preferred_cache_size < available / 5) { if (preferred_cache_size < available / 5) {
preferred_cache_size = std::min( const base::ClampedNumeric<int64_t> clamped_available(available);
(preferred_cache_size * percent_relative_size) / 100, available / 5); preferred_cache_size =
std::min((preferred_cache_size * percent_relative_size) / 100,
clamped_available / 5);
} }
} }
@ -202,14 +206,14 @@ int PreferredCacheSize(int64_t available, net::CacheType type) {
// from the blockfile backend with the following explanation: // from the blockfile backend with the following explanation:
// "Let's not use more than the default size while we tune-up the performance // "Let's not use more than the default size while we tune-up the performance
// of bigger caches. " // of bigger caches. "
int64_t size_limit = scaled_default_disk_cache_size * 4; base::ClampedNumeric<int64_t> size_limit = scaled_default_disk_cache_size * 4;
// Native code entries can be large, so we would like a larger cache. // Native code entries can be large, so we would like a larger cache.
// Make the size limit 50% larger in that case. // Make the size limit 50% larger in that case.
if (type == net::GENERATED_NATIVE_CODE_CACHE) { if (type == net::GENERATED_NATIVE_CODE_CACHE) {
size_limit = (size_limit / 2) * 3; size_limit = (size_limit / 2) * 3;
} else if (type == net::GENERATED_WEBUI_BYTE_CODE_CACHE) { } else if (type == net::GENERATED_WEBUI_BYTE_CODE_CACHE) {
size_limit = size_limit = std::min(
std::min(size_limit, static_cast<int64_t>(kMaxWebUICodeCacheSize)); size_limit, base::ClampedNumeric<int64_t>(kMaxWebUICodeCacheSize));
} }
DCHECK_LT(size_limit, std::numeric_limits<int32_t>::max()); DCHECK_LT(size_limit, std::numeric_limits<int32_t>::max());