[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 1236639 - [1.2] Avoid division by zero in MP3Demuxer. r=gerald
commit 57bdfc8fded25c4d6952208e7e2561509d57f7c5
Author: Eugen Sawin <esawin@xxxxxxxxxxx>
Date: Thu Jan 7 22:45:11 2016 +0100
Bug 1236639 - [1.2] Avoid division by zero in MP3Demuxer. r=gerald
This fixes our bug 20160.
---
dom/media/MP3Demuxer.cpp | 22 +++++++++++++++++-----
dom/media/MP3Demuxer.h | 3 +++
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/dom/media/MP3Demuxer.cpp b/dom/media/MP3Demuxer.cpp
index 2ec5099..7780e57 100644
--- a/dom/media/MP3Demuxer.cpp
+++ b/dom/media/MP3Demuxer.cpp
@@ -204,7 +204,7 @@ MP3TrackDemuxer::FastSeek(const TimeUnit& aTime) {
if (!aTime.ToMicroseconds()) {
// Quick seek to the beginning of the stream.
mFrameIndex = 0;
- } else if (vbr.IsTOCPresent()) {
+ } else if (vbr.IsTOCPresent() && Duration().ToMicroseconds() > 0) {
// Use TOC for more precise seeking.
const float durationFrac = static_cast<float>(aTime.ToMicroseconds()) /
Duration().ToMicroseconds();
@@ -356,7 +356,9 @@ MP3TrackDemuxer::Duration() const {
// Unknown length, we can't estimate duration.
return TimeUnit::FromMicroseconds(-1);
}
- numFrames = (streamLen - mFirstFrameOffset) / AverageFrameLength();
+ if (AverageFrameLength() > 0) {
+ numFrames = (streamLen - mFirstFrameOffset) / AverageFrameLength();
+ }
}
return Duration(numFrames);
}
@@ -532,7 +534,7 @@ MP3TrackDemuxer::OffsetFromFrameIndex(int64_t aFrameIndex) const {
int64_t offset = 0;
const auto& vbr = mParser.VBRInfo();
- if (vbr.NumBytes() && vbr.NumAudioFrames()) {
+ if (vbr.IsValid()) {
offset = mFirstFrameOffset + aFrameIndex * vbr.NumBytes().value() /
vbr.NumAudioFrames().value();
} else if (AverageFrameLength() > 0) {
@@ -548,7 +550,7 @@ MP3TrackDemuxer::FrameIndexFromOffset(int64_t aOffset) const {
int64_t frameIndex = 0;
const auto& vbr = mParser.VBRInfo();
- if (vbr.NumBytes() && vbr.NumAudioFrames()) {
+ if (vbr.IsValid()) {
frameIndex = static_cast<float>(aOffset - mFirstFrameOffset) /
vbr.NumBytes().value() * vbr.NumAudioFrames().value();
frameIndex = std::min<int64_t>(vbr.NumAudioFrames().value(), frameIndex);
@@ -624,7 +626,7 @@ MP3TrackDemuxer::AverageFrameLength() const {
return static_cast<double>(mTotalFrameLen) / mNumParsedFrames;
}
const auto& vbr = mParser.VBRInfo();
- if (vbr.NumBytes() && vbr.NumAudioFrames()) {
+ if (vbr.IsValid() && vbr.NumAudioFrames().value() + 1) {
return static_cast<double>(vbr.NumBytes().value()) /
(vbr.NumAudioFrames().value() + 1);
}
@@ -960,6 +962,16 @@ FrameParser::VBRHeader::IsTOCPresent() const {
return mTOC.size() == vbr_header::TOC_SIZE;
}
+bool
+FrameParser::VBRHeader::IsValid() const {
+ return mType != NONE &&
+ mNumAudioFrames.valueOr(0) > 0 &&
+ mNumBytes.valueOr(0) > 0 &&
+ // We don't care about the scale for any computations here.
+ // mScale < 101 &&
+ true;
+}
+
int64_t
FrameParser::VBRHeader::Offset(float aDurationFac) const {
if (!IsTOCPresent()) {
diff --git a/dom/media/MP3Demuxer.h b/dom/media/MP3Demuxer.h
index f42126d..d98cb73 100644
--- a/dom/media/MP3Demuxer.h
+++ b/dom/media/MP3Demuxer.h
@@ -232,6 +232,9 @@ public:
// Returns true iff Xing/Info TOC (table of contents) is present.
bool IsTOCPresent() const;
+ // Returns whether the header is valid (containing reasonable field values).
+ bool IsValid() const;
+
// Returns the byte offset for the given duration percentage as a factor
// (0: begin, 1.0: end).
int64_t Offset(float aDurationFac) const;
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits