diff options
author | damienv@chromium.org <damienv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-23 08:05:50 +0000 |
---|---|---|
committer | damienv@chromium.org <damienv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-23 08:05:50 +0000 |
commit | 3b2fa3e3e105c6620dc83512ec77b963c210c27c (patch) | |
tree | 46fd478906973a711ed431d86a5e12a6e765a73f /media/formats | |
parent | 44088d0717f47dbf9e53b17d4b61db9fe03d7cc8 (diff) | |
download | chromium_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.cc | 20 |
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, |