Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Unified Diff: media/audio/sounds/wav_audio_handler.cc

Issue 1453233002: Improve input handling for WaveAudioHandler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Correct typo Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/audio/sounds/wav_audio_handler.cc
diff --git a/media/audio/sounds/wav_audio_handler.cc b/media/audio/sounds/wav_audio_handler.cc
index c9808394aea0c12c2906b64b2e18f7c9d7769b99..9f073149af6e309913f684f9edf6f7419a69883f 100644
--- a/media/audio/sounds/wav_audio_handler.cc
+++ b/media/audio/sounds/wav_audio_handler.cc
@@ -55,34 +55,58 @@ T ReadInt(const base::StringPiece& data, size_t offset) {
namespace media {
WavAudioHandler::WavAudioHandler(const base::StringPiece& wav_data)
- : num_channels_(0), sample_rate_(0), bits_per_sample_(0), total_frames_(0) {
- CHECK_LE(kWavFileHeaderSize, wav_data.size()) << "wav data is too small";
- CHECK(wav_data.starts_with(kChunkId) &&
- memcmp(wav_data.data() + 8, kFormat, 4) == 0)
- << "incorrect wav header";
+ : is_valid_(false),
+ num_channels_(0),
+ sample_rate_(0),
+ bits_per_sample_(0),
+ total_frames_(0) {
+ if (wav_data.size() < kWavFileHeaderSize) {
+ LOG(ERROR) << "wav_data is too small";
+ return;
+ }
+ if (!wav_data.starts_with(kChunkId) ||
+ memcmp(wav_data.data() + 8, kFormat, 4) != 0) {
+ LOG(ERROR) << "incorrect wav header";
+ return;
+ }
uint32 total_length = std::min(ReadInt<uint32>(wav_data, 4),
static_cast<uint32>(wav_data.size()));
uint32 offset = kWavFileHeaderSize;
while (offset < total_length) {
const int length = ParseSubChunk(wav_data.substr(offset));
- CHECK_LE(0, length) << "can't parse wav sub-chunk";
+ if (length < 0) {
+ LOG(ERROR) << "can't parse wav sub-chunk";
+ ResetAll();
+ return;
+ }
offset += length;
}
+ if (num_channels_ == 0u || bits_per_sample_ == 0u || sample_rate_ == 0u) {
tommi (sloooow) - chröme 2015/11/17 20:48:39 nit: could this expression be is_valid() or do we
slan 2015/11/17 21:50:16 Done.
+ LOG(ERROR) << "Format is invalid. "
+ << "num_channels: " << num_channels_ << " "
+ << "sample_rate: " << sample_rate_ << " "
+ << "bits_per_sample: " << bits_per_sample_;
+ ResetAll();
+ return;
+ }
+
+ // The audio chunk has parsed successfully.
+ is_valid_ = true;
total_frames_ = data_.size() * 8 / num_channels_ / bits_per_sample_;
}
WavAudioHandler::~WavAudioHandler() {}
bool WavAudioHandler::AtEnd(size_t cursor) const {
- return data_.size() <= cursor;
+ return is_valid_ ? data_.size() <= cursor : true;
tommi (sloooow) - chröme 2015/11/17 20:48:39 nit: could also do return !is_valid() || data_.siz
slan 2015/11/17 21:50:16 In practice, this object should not be used if is_
tommi (sloooow) - chröme 2015/11/18 11:52:58 That sounds like a good idea to me and would simpl
}
bool WavAudioHandler::CopyTo(AudioBus* bus,
size_t cursor,
size_t* bytes_written) const {
- if (!bus)
+ if (!is_valid_ || !bus)
return false;
if (bus->channels() != num_channels_) {
DVLOG(1) << "Number of channels mismatch.";
@@ -103,8 +127,9 @@ bool WavAudioHandler::CopyTo(AudioBus* bus,
}
base::TimeDelta WavAudioHandler::GetDuration() const {
- return base::TimeDelta::FromSecondsD(total_frames_ /
- static_cast<double>(sample_rate_));
+ return is_valid_ ? base::TimeDelta::FromSecondsD(
+ total_frames_ / static_cast<double>(sample_rate_))
+ : base::TimeDelta();
}
int WavAudioHandler::ParseSubChunk(const base::StringPiece& data) {
@@ -140,4 +165,13 @@ bool WavAudioHandler::ParseDataChunk(const base::StringPiece& data) {
return true;
}
+void WavAudioHandler::ResetAll() {
+ DCHECK(!is_valid_);
+ data_ = base::StringPiece();
tommi (sloooow) - chröme 2015/11/17 20:48:39 another potential implementation for is_valid();
slan 2015/11/17 21:50:16 I like the idea you left above. Theoretically, we
+ num_channels_ = 0u;
+ sample_rate_ = 0u;
+ bits_per_sample_ = 0u;
+ total_frames_ = 0u;
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698