summaryrefslogtreecommitdiffstats
path: root/media/formats
diff options
context:
space:
mode:
authordamienv@chromium.org <damienv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-23 08:05:50 +0000
committerdamienv@chromium.org <damienv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-23 08:05:50 +0000
commit3b2fa3e3e105c6620dc83512ec77b963c210c27c (patch)
tree46fd478906973a711ed431d86a5e12a6e765a73f /media/formats
parent44088d0717f47dbf9e53b17d4b61db9fe03d7cc8 (diff)
downloadchromium_src-3b2fa3e3e105c6620dc83512ec77b963c210c27c.zip
chromium_src-3b2fa3e3e105c6620dc83512ec77b963c210c27c.tar.gz
chromium_src-3b2fa3e3e105c6620dc83512ec77b963c210c27c.tar.bz2
Fix possible timestamp overflow in the MP4 stream parser.
BUG=345888 Review URL: https://codereview.chromium.org/175693004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@252849 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/formats')
-rw-r--r--media/formats/mp4/track_run_iterator.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/media/formats/mp4/track_run_iterator.cc b/media/formats/mp4/track_run_iterator.cc
index e2a145e..bc38352 100644
--- a/media/formats/mp4/track_run_iterator.cc
+++ b/media/formats/mp4/track_run_iterator.cc
@@ -57,10 +57,22 @@ TrackRunInfo::TrackRunInfo()
TrackRunInfo::~TrackRunInfo() {}
TimeDelta TimeDeltaFromRational(int64 numer, int64 denom) {
- DCHECK_LT((numer > 0 ? numer : -numer),
- kint64max / base::Time::kMicrosecondsPerSecond);
- return TimeDelta::FromMicroseconds(
- base::Time::kMicrosecondsPerSecond * numer / denom);
+ // To avoid overflow, split the following calculation:
+ // (numer * base::Time::kMicrosecondsPerSecond) / denom
+ // into:
+ // (numer / denom) * base::Time::kMicrosecondsPerSecond +
+ // ((numer % denom) * base::Time::kMicrosecondsPerSecond) / denom
+ int64 a = numer / denom;
+ DCHECK_LE((a > 0 ? a : -a), kint64max / base::Time::kMicrosecondsPerSecond);
+ int64 timea_in_us = a * base::Time::kMicrosecondsPerSecond;
+
+ int64 b = numer % denom;
+ DCHECK_LE((b > 0 ? b : -b), kint64max / base::Time::kMicrosecondsPerSecond);
+ int64 timeb_in_us = (b * base::Time::kMicrosecondsPerSecond) / denom;
+
+ DCHECK((timeb_in_us < 0) || (timea_in_us <= kint64max - timeb_in_us));
+ DCHECK((timeb_in_us > 0) || (timea_in_us >= kint64min - timeb_in_us));
+ return TimeDelta::FromMicroseconds(timea_in_us + timeb_in_us);
}
TrackRunIterator::TrackRunIterator(const Movie* moov,