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

Commit 72816ee6 authored by Andy Hung's avatar Andy Hung Committed by Tom Powell
Browse files

AudioFlinger: Check framecount overflow when creating track

Test: Native POC
Bug: 34749571
AOSP-Change-Id: I7529658e52ac7e64d162eb5338f10fb25eaa8fe7
(cherry picked from commit 1883f69d)
(cherry picked from commit eaa3969f)

CVE-2017-0597

Change-Id: I2a9338daba9a6aae882daa176cf4c8445de316e6
parent abf8512a
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -114,9 +114,24 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
    mUid = clientUid;

    // ALOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);

    size_t bufferSize = buffer == NULL ? roundup(frameCount) : frameCount;
    // check overflow when computing bufferSize due to multiplication by mFrameSize.
    if (bufferSize < frameCount  // roundup rounds down for values above UINT_MAX / 2
            || mFrameSize == 0   // format needs to be correct
            || bufferSize > SIZE_MAX / mFrameSize) {
        android_errorWriteLog(0x534e4554, "34749571");
        return;
    }
    bufferSize *= mFrameSize;

    size_t size = sizeof(audio_track_cblk_t);
    size_t bufferSize = (buffer == NULL ? roundup(frameCount) : frameCount) * mFrameSize;
    if (buffer == NULL && alloc == ALLOC_CBLK) {
        // check overflow when computing allocation size for streaming tracks.
        if (size > SIZE_MAX - bufferSize) {
            android_errorWriteLog(0x534e4554, "34749571");
            return;
        }
        size += bufferSize;
    }