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

Commit 0f111c80 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Merge cherrypicks of [9427496, 9427497, 9427498, 9427499, 9427540, 9427541,...

Merge cherrypicks of [9427496, 9427497, 9427498, 9427499, 9427540, 9427541, 9427522, 9427523, 9427525, 9427526, 9427527, 9427504, 9427542, 9427505, 9427468, 9427469, 9427506, 9427236, 9427238, 9427239, 9427454, 9427455, 9427561, 9427390, 9427470, 9427456, 9427472, 9427393, 9427531, 9427213, 9427459, 9427581, 9427583, 9427545, 9427362, 9427563, 9427564, 9427533, 9427534, 9427546, 9427395, 9427397, 9427475, 9427565, 9427535] into qt-release

Change-Id: Ie4ad5a4537ff5011f534902e1136411e2034a920
parents 69b28f6b e732ffad
Loading
Loading
Loading
Loading
+31 −22
Original line number Diff line number Diff line
@@ -62,11 +62,9 @@ Return<void> CryptoPlugin::decrypt(
      secure, keyId, iv, mode, pattern, subSamples, source, offset, destination,
      [&](Status_V1_2 hStatus, uint32_t hBytesWritten, hidl_string hDetailedError) {
        status = toStatus_1_0(hStatus);
        if (status == Status::OK) {
        bytesWritten = hBytesWritten;
        detailedError = hDetailedError;
      }
      }
    );

  status = hResult.isOk() ? status : Status::ERROR_DRM_CANNOT_HANDLE;
@@ -109,6 +107,10 @@ Return<void> CryptoPlugin::decrypt_1_2(
                 "destination decrypt buffer base not set");
        return Void();
      }
    } else {
        _hidl_cb(Status_V1_2::ERROR_DRM_CANNOT_HANDLE, 0,
                 "destination type not supported");
        return Void();
    }

    sp<IMemory> sourceBase = mSharedBufferMap[source.bufferId];
@@ -126,7 +128,7 @@ Return<void> CryptoPlugin::decrypt_1_2(
            (static_cast<void *>(sourceBase->getPointer()));
    uint8_t* srcPtr = static_cast<uint8_t *>(base + source.offset + offset);
    void* destPtr = NULL;
    if (destination.type == BufferType::SHARED_MEMORY) {
    // destination.type == BufferType::SHARED_MEMORY
    const SharedBuffer& destBuffer = destination.nonsecureMemory;
    sp<IMemory> destBase = mSharedBufferMap[destBuffer.bufferId];
    if (destBase == nullptr) {
@@ -139,11 +141,7 @@ Return<void> CryptoPlugin::decrypt_1_2(
        return Void();
    }
    destPtr = static_cast<void *>(base + destination.nonsecureMemory.offset);
    } else if (destination.type == BufferType::NATIVE_HANDLE) {
        native_handle_t *handle = const_cast<native_handle_t *>(
        destination.secureMemory.getNativeHandle());
        destPtr = static_cast<void *>(handle);
    }


    // Calculate the output buffer size and determine if any subsamples are
    // encrypted.
@@ -151,13 +149,24 @@ Return<void> CryptoPlugin::decrypt_1_2(
    bool haveEncryptedSubsamples = false;
    for (size_t i = 0; i < subSamples.size(); i++) {
        const SubSample &subSample = subSamples[i];
        destSize += subSample.numBytesOfClearData;
        destSize += subSample.numBytesOfEncryptedData;
        if (__builtin_add_overflow(destSize, subSample.numBytesOfClearData, &destSize)) {
            _hidl_cb(Status_V1_2::ERROR_DRM_FRAME_TOO_LARGE, 0, "subsample clear size overflow");
            return Void();
        }
        if (__builtin_add_overflow(destSize, subSample.numBytesOfEncryptedData, &destSize)) {
            _hidl_cb(Status_V1_2::ERROR_DRM_FRAME_TOO_LARGE, 0, "subsample encrypted size overflow");
            return Void();
        }
        if (subSample.numBytesOfEncryptedData > 0) {
        haveEncryptedSubsamples = true;
        }
    }

    if (destSize > destBuffer.size) {
        _hidl_cb(Status_V1_2::ERROR_DRM_FRAME_TOO_LARGE, 0, "subsample sum too large");
        return Void();
    }

    if (mode == Mode::UNENCRYPTED) {
        if (haveEncryptedSubsamples) {
            _hidl_cb(Status_V1_2::ERROR_DRM_CANNOT_HANDLE, 0,