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

Commit db3fa5f9 authored by Jeff Tinker's avatar Jeff Tinker
Browse files

Throw exception on mismatched system vs vendor

When the system partition is a later version than vendor,
new MediaDrm APIs will not have HAL implementations. In
this case throw java.lang.UnsupportedOperationException.

bug:110701831
bug:123375769

test: cts media test cases, gts media tests
Change-Id: Ib631bf4d4d245d857e61bd3fe0e5808e430a034d
parent 8ce16d86
Loading
Loading
Loading
Loading
+39 −33
Original line number Diff line number Diff line
@@ -586,51 +586,57 @@ Return<void> DrmHal::sendSessionLostState(
    return Void();
}

bool DrmHal::matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory,
status_t DrmHal::matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory,
                                               const uint8_t uuid[16],
                                               const String8 &mimeType,
                                           DrmPlugin::SecurityLevel level) {
    if (mimeType == "") {
        return true;
    } else if (!factory->isContentTypeSupported(mimeType.string())) {
        return false;
    }
                                               DrmPlugin::SecurityLevel level,
                                               bool *isSupported) {
    *isSupported = false;

    // handle default value cases
    if (level == DrmPlugin::kSecurityLevelUnknown) {
        return true;
        if (mimeType == "") {
            // isCryptoSchemeSupported(uuid)
            *isSupported = true;
        } else {
            // isCryptoSchemeSupported(uuid, mimeType)
            *isSupported = factory->isContentTypeSupported(mimeType.string());
        }
        return OK;
    } else if (mimeType == "") {
        return BAD_VALUE;
    }

    sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory);
    if (factoryV1_2 == NULL) {
            return true;
        } else if (factoryV1_2->isCryptoSchemeSupported_1_2(uuid,
                        mimeType.string(), toHidlSecurityLevel(level))) {
            return true;
        }
        return ERROR_UNSUPPORTED;
    } else {
        *isSupported = factoryV1_2->isCryptoSchemeSupported_1_2(uuid,
                mimeType.string(), toHidlSecurityLevel(level));
        return OK;
    }
    return false;
}

bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16],
status_t DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16],
                                         const String8 &mimeType,
                                     DrmPlugin::SecurityLevel level) {
                                         DrmPlugin::SecurityLevel level,
                                         bool *isSupported) {
    Mutex::Autolock autoLock(mLock);

    for (size_t i = 0; i < mFactories.size(); i++) {
        sp<IDrmFactory> factory = mFactories[i];
        if (factory->isCryptoSchemeSupported(uuid)) {
            if (matchMimeTypeAndSecurityLevel(factory, uuid, mimeType, level)) {
                return true;
            }
    *isSupported = false;
    for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
            return matchMimeTypeAndSecurityLevel(mFactories[i],
                    uuid, mimeType, level, isSupported);
        }
    }
    return false;
    return OK;
}

status_t DrmHal::createPlugin(const uint8_t uuid[16],
        const String8& appPackageName) {
    Mutex::Autolock autoLock(mLock);

    for (size_t i = mFactories.size() - 1; i >= 0; i--) {
    for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
            auto plugin = makeDrmPlugin(mFactories[i], uuid, appPackageName);
            if (plugin != NULL) {
@@ -1213,7 +1219,7 @@ status_t DrmHal::getOfflineLicenseKeySetIds(List<Vector<uint8_t>> &keySetIds) co
    }

    if (mPluginV1_2 == NULL) {
        return ERROR_DRM_CANNOT_HANDLE;
        return ERROR_UNSUPPORTED;
    }

    status_t err = UNKNOWN_ERROR;
@@ -1238,7 +1244,7 @@ status_t DrmHal::removeOfflineLicense(Vector<uint8_t> const &keySetId) {
    }

    if (mPluginV1_2 == NULL) {
        return ERROR_DRM_CANNOT_HANDLE;
        return ERROR_UNSUPPORTED;
    }

    Return<Status> status = mPluginV1_2->removeOfflineLicense(toHidlVec(keySetId));
@@ -1254,7 +1260,7 @@ status_t DrmHal::getOfflineLicenseState(Vector<uint8_t> const &keySetId,
    }

    if (mPluginV1_2 == NULL) {
        return ERROR_DRM_CANNOT_HANDLE;
        return ERROR_UNSUPPORTED;
    }
    *licenseState = DrmPlugin::kOfflineLicenseStateUnknown;

+9 −5
Original line number Diff line number Diff line
@@ -83,8 +83,8 @@ struct BpDrm : public BpInterface<IDrm> {
        return reply.readInt32();
    }

    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
            DrmPlugin::SecurityLevel level) {
    virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
            DrmPlugin::SecurityLevel level, bool *isSupported) {
        Parcel data, reply;
        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
        data.write(uuid, 16);
@@ -94,10 +94,11 @@ struct BpDrm : public BpInterface<IDrm> {
        status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
        if (status != OK) {
            ALOGE("isCryptoSchemeSupported: binder call failed: %d", status);
            return false;
            return status;
        }
        *isSupported = static_cast<bool>(reply.readInt32());

        return reply.readInt32() != 0;
        return reply.readInt32();
    }

    virtual status_t createPlugin(const uint8_t uuid[16],
@@ -773,7 +774,10 @@ status_t BnDrm::onTransact(
            String8 mimeType = data.readString8();
            DrmPlugin::SecurityLevel level =
                    static_cast<DrmPlugin::SecurityLevel>(data.readInt32());
            reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType, level));
            bool isSupported = false;
            status_t result = isCryptoSchemeSupported(uuid, mimeType, level, &isSupported);
            reply->writeInt32(isSupported);
            reply->writeInt32(result);
            return OK;
        }

+9 −7
Original line number Diff line number Diff line
@@ -63,9 +63,10 @@ struct DrmHal : public BnDrm,

    virtual status_t initCheck() const;

    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16],
    virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16],
                                             const String8& mimeType,
                                         DrmPlugin::SecurityLevel level);
                                             DrmPlugin::SecurityLevel level,
                                             bool *isSupported);

    virtual status_t createPlugin(const uint8_t uuid[16],
                                  const String8 &appPackageName);
@@ -226,10 +227,11 @@ private:
    status_t getPropertyStringInternal(String8 const &name, String8 &value) const;
    status_t getPropertyByteArrayInternal(String8 const &name,
                                          Vector<uint8_t> &value) const;
    bool matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory,
    status_t matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory,
                                           const uint8_t uuid[16],
                                           const String8 &mimeType,
                                       DrmPlugin::SecurityLevel level);
                                           DrmPlugin::SecurityLevel level,
                                           bool *isSupported);

    DISALLOW_EVIL_CONSTRUCTORS(DrmHal);
};
+4 −3
Original line number Diff line number Diff line
@@ -34,9 +34,10 @@ struct IDrm : public IInterface {

    virtual status_t initCheck() const = 0;

    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16],
    virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16],
                                             const String8 &mimeType,
                                         DrmPlugin::SecurityLevel securityLevel) = 0;
                                             DrmPlugin::SecurityLevel securityLevel,
                                             bool *result) = 0;

    virtual status_t createPlugin(const uint8_t uuid[16],
                                  const String8 &appPackageName) = 0;
+5 −2
Original line number Diff line number Diff line
@@ -159,10 +159,13 @@ Vector<DrmUUID> NuPlayerDrm::getSupportedDrmSchemes(const void *pssh, size_t pss
    if (drm != NULL) {
        for (size_t i = 0; i < psshDRMs.size(); i++) {
            DrmUUID uuid = psshDRMs[i];
            if (drm->isCryptoSchemeSupported(uuid.ptr(), String8(),
                            DrmPlugin::kSecurityLevelUnknown))
            bool isSupported = false;
            status = drm->isCryptoSchemeSupported(uuid.ptr(), String8(),
                    DrmPlugin::kSecurityLevelUnknown, &isSupported);
            if (status == OK && isSupported) {
                supportedDRMs.add(uuid);
            }
        }

        drm.clear();
    } else {
Loading