Fix potential signed overflow in IntervalBudget::set_target_rate_kbps
This methods multiplies an int with 500. This cl ensure that does not overflow.
BUG=none
Change-Id: I2c4c4c169baf3bbc2cac021e87e396c605cd1815
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/141860
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28310}
diff --git a/modules/pacing/interval_budget.cc b/modules/pacing/interval_budget.cc
index 9fe0563..321ca46 100644
--- a/modules/pacing/interval_budget.cc
+++ b/modules/pacing/interval_budget.cc
@@ -16,7 +16,7 @@
namespace webrtc {
namespace {
-constexpr int kWindowMs = 500;
+constexpr int64_t kWindowMs = 500;
}
IntervalBudget::IntervalBudget(int initial_target_rate_kbps)
@@ -36,7 +36,7 @@
}
void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {
- int bytes = rtc::dchecked_cast<int>(target_rate_kbps_ * delta_time_ms / 8);
+ int64_t bytes = target_rate_kbps_ * delta_time_ms / 8;
if (bytes_remaining_ < 0 || can_build_up_underuse_) {
// We overused last interval, compensate this interval.
bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);
@@ -52,7 +52,7 @@
}
size_t IntervalBudget::bytes_remaining() const {
- return static_cast<size_t>(std::max(0, bytes_remaining_));
+ return rtc::saturated_cast<size_t>(std::max<int64_t>(0, bytes_remaining_));
}
double IntervalBudget::budget_ratio() const {
diff --git a/modules/pacing/interval_budget.h b/modules/pacing/interval_budget.h
index 43f3867..faeb1d8 100644
--- a/modules/pacing/interval_budget.h
+++ b/modules/pacing/interval_budget.h
@@ -34,8 +34,8 @@
private:
int target_rate_kbps_;
- int max_bytes_in_budget_;
- int bytes_remaining_;
+ int64_t max_bytes_in_budget_;
+ int64_t bytes_remaining_;
bool can_build_up_underuse_;
};