diff --git a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc index f7bb2acd2aa17..d16a16d5465a3 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc +++ b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc @@ -638,7 +638,13 @@ void MixerInputConnection::RestartPlaybackAt(int64_t timestamp, int64_t pts) { void MixerInputConnection::SetMediaPlaybackRate(double rate) { DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); LOG(INFO) << this << " SetMediaPlaybackRate rate=" << rate; - DCHECK_GT(rate, 0); + // |rate| comes off an unauthenticated local socket. A non-positive rate + // produces a negative |frames_to_crop| in FillTimestampedAudio() and a heap + // OOB read in FillFromQueue(). Reject it instead of DCHECKing. + if (!(rate > 0)) { + LOG(WARNING) << this << " Rejecting invalid playback rate " << rate; + return; + } base::AutoLock lock(lock_); if (state_ == State::kGotEos || state_ == State::kRemoved) {