NetEq: Fix an UBSan error

UBSan will trigger when time_stretched_samples overflows using a
big number. This change avoids this problem by storing the
intermediate result into a int64_t.

Bug: chromium:886904
Change-Id: Id09dc4b468f841f03b523d5f21763f610b163a42
Reviewed-on: https://webrtc-review.googlesource.com/c/103123
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Commit-Queue: Pablo Barrera González <barrerap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24977}
This commit is contained in:
Pablo Barrera González 2018-10-03 15:03:11 +02:00 committed by Commit Bot
parent 311c13b3c2
commit bc2959072d

View File

@ -12,6 +12,8 @@
#include <algorithm> // Provide access to std::max.
#include "rtc_base/numerics/safe_conversions.h"
namespace webrtc {
BufferLevelFilter::BufferLevelFilter() {
@ -33,7 +35,7 @@ void BufferLevelFilter::Update(size_t buffer_size_packets,
// |buffer_size_packets| is in Q0.
filtered_current_level_ =
((level_factor_ * filtered_current_level_) >> 8) +
((256 - level_factor_) * static_cast<int>(buffer_size_packets));
((256 - level_factor_) * rtc::dchecked_cast<int>(buffer_size_packets));
// Account for time-scale operations (accelerate and pre-emptive expand).
if (time_stretched_samples && packet_len_samples > 0) {
@ -41,9 +43,13 @@ void BufferLevelFilter::Update(size_t buffer_size_packets,
// value of |time_stretched_samples| from |filtered_current_level_| after
// converting |time_stretched_samples| from samples to packets in Q8.
// Make sure that the filtered value remains non-negative.
filtered_current_level_ = std::max(
0, filtered_current_level_ - (time_stretched_samples * (1 << 8)) /
static_cast<int>(packet_len_samples));
int64_t time_stretched_packets =
(int64_t{time_stretched_samples} * (1 << 8)) /
rtc::dchecked_cast<int64_t>(packet_len_samples);
filtered_current_level_ = rtc::saturated_cast<int>(
std::max<int64_t>(0, filtered_current_level_ - time_stretched_packets));
}
}