libmediadrm: handle hidl txn failures
Bug: 164486735
Test: MediaDrmTest
Change-Id: I34c48b93b5fc3be0aa6edaaed89fc5e75dd61212
diff --git a/drm/libmediadrm/CryptoHal.cpp b/drm/libmediadrm/CryptoHal.cpp
index 3257f71..e0db1c4 100644
--- a/drm/libmediadrm/CryptoHal.cpp
+++ b/drm/libmediadrm/CryptoHal.cpp
@@ -382,7 +382,8 @@
return;
}
- mPlugin->notifyResolution(width, height);
+ auto hResult = mPlugin->notifyResolution(width, height);
+ ALOGE_IF(!hResult.isOk(), "notifyResolution txn failed %s", hResult.description().c_str());
}
status_t CryptoHal::setMediaDrmSession(const Vector<uint8_t> &sessionId) {
@@ -392,7 +393,8 @@
return mInitCheck;
}
- return toStatusT(mPlugin->setMediaDrmSession(toHidlVec(sessionId)));
+ auto err = mPlugin->setMediaDrmSession(toHidlVec(sessionId));
+ return err.isOk() ? toStatusT(err) : DEAD_OBJECT;
}
status_t CryptoHal::getLogMessages(Vector<drm::V1_4::LogMessage> &logs) const {
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp
index 253a1fa..40d1e0c 100644
--- a/drm/libmediadrm/DrmHal.cpp
+++ b/drm/libmediadrm/DrmHal.cpp
@@ -888,7 +888,7 @@
Return<void> hResult;
if (mPluginV1_2 != NULL) {
- Return<void> hResult = mPluginV1_2->getProvisionRequest_1_2(
+ hResult = mPluginV1_2->getProvisionRequest_1_2(
toHidlString(certType), toHidlString(certAuthority),
[&](Status_V1_2 status, const hidl_vec<uint8_t>& hRequest,
const hidl_string& hDefaultUrl) {
@@ -900,7 +900,7 @@
}
);
} else {
- Return<void> hResult = mPlugin->getProvisionRequest(
+ hResult = mPlugin->getProvisionRequest(
toHidlString(certType), toHidlString(certAuthority),
[&](Status status, const hidl_vec<uint8_t>& hRequest,
const hidl_string& hDefaultUrl) {
@@ -1522,22 +1522,38 @@
return metricsString;
}
-bool DrmHal::requiresSecureDecoder(const char *mime) const {
+status_t DrmHal::requiresSecureDecoder(const char *mime, bool *required) const {
Mutex::Autolock autoLock(mLock);
if (mPluginV1_4 == NULL) {
return false;
}
- return mPluginV1_4->requiresSecureDecoderDefault(hidl_string(mime));
+ auto hResult = mPluginV1_4->requiresSecureDecoderDefault(hidl_string(mime));
+ if (!hResult.isOk()) {
+ DrmUtils::LOG2BE("requiresSecureDecoder txn failed: %s", hResult.description().c_str());
+ return DEAD_OBJECT;
+ }
+ if (required) {
+ *required = hResult;
+ }
+ return OK;
}
-bool DrmHal::requiresSecureDecoder(const char *mime,
- DrmPlugin::SecurityLevel securityLevel) const {
+status_t DrmHal::requiresSecureDecoder(const char *mime, DrmPlugin::SecurityLevel securityLevel,
+ bool *required) const {
Mutex::Autolock autoLock(mLock);
if (mPluginV1_4 == NULL) {
return false;
}
auto hLevel = toHidlSecurityLevel(securityLevel);
- return mPluginV1_4->requiresSecureDecoder(hidl_string(mime), hLevel);
+ auto hResult = mPluginV1_4->requiresSecureDecoder(hidl_string(mime), hLevel);
+ if (!hResult.isOk()) {
+ DrmUtils::LOG2BE("requiresSecureDecoder txn failed: %s", hResult.description().c_str());
+ return DEAD_OBJECT;
+ }
+ if (required) {
+ *required = hResult;
+ }
+ return OK;
}
status_t DrmHal::setPlaybackId(Vector<uint8_t> const &sessionId, const char *playbackId) {
@@ -1545,10 +1561,8 @@
if (mPluginV1_4 == NULL) {
return ERROR_UNSUPPORTED;
}
- drm::V1_0::Status err = mPluginV1_4->setPlaybackId(
- toHidlVec(sessionId),
- hidl_string(playbackId));
- return toStatusT(err);
+ auto err = mPluginV1_4->setPlaybackId(toHidlVec(sessionId), hidl_string(playbackId));
+ return err.isOk() ? toStatusT(err) : DEAD_OBJECT;
}
status_t DrmHal::getLogMessages(Vector<drm::V1_4::LogMessage> &logs) const {
diff --git a/drm/libmediadrm/DrmUtils.cpp b/drm/libmediadrm/DrmUtils.cpp
index ed3848d..ee0dc23 100644
--- a/drm/libmediadrm/DrmUtils.cpp
+++ b/drm/libmediadrm/DrmUtils.cpp
@@ -82,7 +82,17 @@
auto factory = Hal::getService(instance);
if (factory != nullptr) {
instances[instance.c_str()] = Hal::descriptor;
- if (!uuid || factory->isCryptoSchemeSupported(uuid)) {
+ if (!uuid) {
+ factories.push_back(factory);
+ continue;
+ }
+ auto supported = factory->isCryptoSchemeSupported(uuid);
+ if (!supported.isOk()) {
+ LOG2BE(uuid, "isCryptoSchemeSupported txn failed: %s",
+ supported.description().c_str());
+ continue;
+ }
+ if (supported) {
factories.push_back(factory);
}
}
@@ -114,30 +124,42 @@
sp<::V1_0::IDrmPlugin> MakeDrmPlugin(const sp<::V1_0::IDrmFactory> &factory,
const uint8_t uuid[16], const char *appPackageName) {
sp<::V1_0::IDrmPlugin> plugin;
- factory->createPlugin(toHidlArray16(uuid), hidl_string(appPackageName),
- [&](::V1_0::Status status, const sp<::V1_0::IDrmPlugin> &hPlugin) {
- if (status != ::V1_0::Status::OK) {
- LOG2BE(uuid, "MakeDrmPlugin failed: %d", status);
- return;
- }
- plugin = hPlugin;
- });
- return plugin;
+ auto err = factory->createPlugin(
+ toHidlArray16(uuid), hidl_string(appPackageName),
+ [&](::V1_0::Status status, const sp<::V1_0::IDrmPlugin> &hPlugin) {
+ if (status != ::V1_0::Status::OK) {
+ LOG2BE(uuid, "MakeDrmPlugin failed: %d", status);
+ return;
+ }
+ plugin = hPlugin;
+ });
+ if (err.isOk()) {
+ return plugin;
+ } else {
+ LOG2BE(uuid, "MakeDrmPlugin txn failed: %s", err.description().c_str());
+ return nullptr;
+ }
}
sp<::V1_0::ICryptoPlugin> MakeCryptoPlugin(const sp<::V1_0::ICryptoFactory> &factory,
const uint8_t uuid[16], const void *initData,
size_t initDataSize) {
sp<::V1_0::ICryptoPlugin> plugin;
- factory->createPlugin(toHidlArray16(uuid), toHidlVec(initData, initDataSize),
- [&](::V1_0::Status status, const sp<::V1_0::ICryptoPlugin> &hPlugin) {
- if (status != ::V1_0::Status::OK) {
- LOG2BE(uuid, "MakeCryptoPlugin failed: %d", status);
- return;
- }
- plugin = hPlugin;
- });
- return plugin;
+ auto err = factory->createPlugin(
+ toHidlArray16(uuid), toHidlVec(initData, initDataSize),
+ [&](::V1_0::Status status, const sp<::V1_0::ICryptoPlugin> &hPlugin) {
+ if (status != ::V1_0::Status::OK) {
+ LOG2BE(uuid, "MakeCryptoPlugin failed: %d", status);
+ return;
+ }
+ plugin = hPlugin;
+ });
+ if (err.isOk()) {
+ return plugin;
+ } else {
+ LOG2BE(uuid, "MakeCryptoPlugin txn failed: %s", err.description().c_str());
+ return nullptr;
+ }
}
} // namespace
diff --git a/drm/libmediadrm/include/mediadrm/DrmHal.h b/drm/libmediadrm/include/mediadrm/DrmHal.h
index c5206fa..7eb1dec 100644
--- a/drm/libmediadrm/include/mediadrm/DrmHal.h
+++ b/drm/libmediadrm/include/mediadrm/DrmHal.h
@@ -179,11 +179,10 @@
virtual status_t setListener(const sp<IDrmClient>& listener);
- virtual bool requiresSecureDecoder(const char *mime) const;
+ virtual status_t requiresSecureDecoder(const char *mime, bool *required) const;
- virtual bool requiresSecureDecoder(
- const char *mime,
- DrmPlugin::SecurityLevel securityLevel) const;
+ virtual status_t requiresSecureDecoder(const char *mime, DrmPlugin::SecurityLevel securityLevel,
+ bool *required) const;
virtual status_t setPlaybackId(
Vector<uint8_t> const &sessionId,
diff --git a/drm/libmediadrm/include/mediadrm/IDrm.h b/drm/libmediadrm/include/mediadrm/IDrm.h
index 80c5c9b..a88784d 100644
--- a/drm/libmediadrm/include/mediadrm/IDrm.h
+++ b/drm/libmediadrm/include/mediadrm/IDrm.h
@@ -154,12 +154,10 @@
virtual status_t setListener(const sp<IDrmClient>& listener) = 0;
- virtual bool requiresSecureDecoder(
- const char *mime) const = 0;
+ virtual status_t requiresSecureDecoder(const char *mime, bool *required) const = 0;
- virtual bool requiresSecureDecoder(
- const char *mime,
- DrmPlugin::SecurityLevel securityLevel) const = 0;
+ virtual status_t requiresSecureDecoder(const char *mime, DrmPlugin::SecurityLevel securityLevel,
+ bool *required) const = 0;
virtual status_t setPlaybackId(
Vector<uint8_t> const &sessionId,