Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8905fc7a authored by Marco Nelissen's avatar Marco Nelissen Committed by Android (Google) Code Review
Browse files

Merge "MP3Extractor: fix overflow on duration estimation" into nyc-dev

parents 7f688edc 63690d15
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -61,8 +61,30 @@ FileSource::FileSource(int fd, int64_t offset, int64_t length)
    ALOGV("fd=%d (%s), offset=%lld, length=%lld",
            fd, nameForFd(fd).c_str(), (long long) offset, (long long) length);

    CHECK(offset >= 0);
    CHECK(length >= 0);
    if (mOffset < 0) {
        mOffset = 0;
    }
    if (mLength < 0) {
        mLength = 0;
    }
    if (mLength > INT64_MAX - mOffset) {
        mLength = INT64_MAX - mOffset;
    }
    struct stat s;
    if (fstat(fd, &s) == 0) {
        if (mOffset > s.st_size) {
            mOffset = s.st_size;
            mLength = 0;
        }
        if (mOffset + mLength > s.st_size) {
            mLength = s.st_size - mOffset;
        }
    }
    if (mOffset != offset || mLength != length) {
        ALOGW("offset/length adjusted from %lld/%lld to %lld/%lld",
                (long long) offset, (long long) length,
                (long long) mOffset, (long long) mLength);
    }
}

FileSource::~FileSource() {
+8 −1
Original line number Diff line number Diff line
@@ -252,6 +252,7 @@ MP3Extractor::MP3Extractor(
      mDataSource(source),
      mFirstFramePos(-1),
      mFixedHeader(0) {

    off64_t pos = 0;
    off64_t post_id3_pos;
    uint32_t header;
@@ -350,7 +351,13 @@ MP3Extractor::MP3Extractor(
    if (mSeeker == NULL || !mSeeker->getDuration(&durationUs)) {
        off64_t fileSize;
        if (mDataSource->getSize(&fileSize) == OK) {
            durationUs = 8000LL * (fileSize - mFirstFramePos) / bitrate;
            off64_t dataLength = fileSize - mFirstFramePos;
            if (dataLength > INT64_MAX / 8000LL) {
                // duration would overflow
                durationUs = INT64_MAX;
            } else {
                durationUs = 8000LL * dataLength / bitrate;
            }
        } else {
            durationUs = -1;
        }