From 62eb89d2218e0731628f8df427741c32382985bd Mon Sep 17 00:00:00 2001 From: Minyue Li Date: Mon, 1 Jul 2019 11:23:04 +0200 Subject: [PATCH] Fixing possible overflow in NetEq buffle level filter. Bug: chromium:979281 Change-Id: Ieb3a8f9dc03114b76b13d1f8c529e9f759804da9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144240 Commit-Queue: Minyue Li Reviewed-by: Henrik Lundin Reviewed-by: Jakob Ivarsson Cr-Commit-Position: refs/heads/master@{#28433} --- modules/audio_coding/neteq/buffer_level_filter.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/audio_coding/neteq/buffer_level_filter.cc b/modules/audio_coding/neteq/buffer_level_filter.cc index 0d75a47144..144da63987 100644 --- a/modules/audio_coding/neteq/buffer_level_filter.cc +++ b/modules/audio_coding/neteq/buffer_level_filter.cc @@ -33,15 +33,15 @@ void BufferLevelFilter::Update(size_t buffer_size_samples, // (1 - |level_factor_|) * |buffer_size_samples| // |level_factor_| and |filtered_current_level_| are in Q8. // |buffer_size_samples| is in Q0. - filtered_current_level_ = - ((level_factor_ * filtered_current_level_) >> 8) + + const int64_t filtered_current_level = + ((level_factor_ * int64_t{filtered_current_level_}) >> 8) + ((256 - level_factor_) * rtc::dchecked_cast(buffer_size_samples)); // Account for time-scale operations (accelerate and pre-emptive expand) and // make sure that the filtered value remains non-negative. filtered_current_level_ = rtc::saturated_cast(std::max( 0, - filtered_current_level_ - (int64_t{time_stretched_samples} * (1 << 8)))); + filtered_current_level - (int64_t{time_stretched_samples} * (1 << 8)))); } void BufferLevelFilter::SetTargetBufferLevel(int target_buffer_level) {