Commit 5d1dc3ce authored by Yuchen Liu's avatar Yuchen Liu Committed by Commit Bot

[Fuchsia][EME] Handle cdm object disconnect

Check if cdm object still alive before calling fidl APIs on it.

Bug: 1001358
Test: Open page using Widevine on device without Widevine service.
Change-Id: Ib82ab66b8dc5eec03a4f64c5e499fef3a93a0493
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1802711Reviewed-by: default avatarSergey Ulanov <sergeyu@chromium.org>
Commit-Queue: Sergey Ulanov <sergeyu@chromium.org>
Auto-Submit: Yuchen Liu <yucliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697048}
parent 51ca833e
...@@ -12,6 +12,13 @@ ...@@ -12,6 +12,13 @@
#include "media/base/cdm_promise.h" #include "media/base/cdm_promise.h"
#include "media/fuchsia/cdm/fuchsia_decryptor.h" #include "media/fuchsia/cdm/fuchsia_decryptor.h"
#define REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm) \
if (!cdm) { \
promise->reject(CdmPromise::Exception::INVALID_STATE_ERROR, 0, \
"CDM channel is disconnected."); \
return; \
}
namespace media { namespace media {
namespace { namespace {
...@@ -226,10 +233,12 @@ FuchsiaCdm::FuchsiaCdm(fuchsia::media::drm::ContentDecryptionModulePtr cdm, ...@@ -226,10 +233,12 @@ FuchsiaCdm::FuchsiaCdm(fuchsia::media::drm::ContentDecryptionModulePtr cdm,
session_callbacks_(std::move(callbacks)), session_callbacks_(std::move(callbacks)),
decryptor_(new FuchsiaDecryptor(cdm_.get())) { decryptor_(new FuchsiaDecryptor(cdm_.get())) {
DCHECK(cdm_); DCHECK(cdm_);
cdm_.set_error_handler([](zx_status_t status) { cdm_.set_error_handler([this](zx_status_t status) {
// Error will be handled in CdmSession::OnSessionError.
ZX_LOG(ERROR, status) << "The fuchsia.media.drm.ContentDecryptionModule" ZX_LOG(ERROR, status) << "The fuchsia.media.drm.ContentDecryptionModule"
<< " channel was terminated."; << " channel was terminated.";
// Reject all the pending promises.
promises_.Clear();
}); });
} }
...@@ -238,6 +247,8 @@ FuchsiaCdm::~FuchsiaCdm() = default; ...@@ -238,6 +247,8 @@ FuchsiaCdm::~FuchsiaCdm() = default;
void FuchsiaCdm::SetServerCertificate( void FuchsiaCdm::SetServerCertificate(
const std::vector<uint8_t>& certificate, const std::vector<uint8_t>& certificate,
std::unique_ptr<SimpleCdmPromise> promise) { std::unique_ptr<SimpleCdmPromise> promise) {
REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm_);
uint32_t promise_id = promises_.SavePromise(std::move(promise)); uint32_t promise_id = promises_.SavePromise(std::move(promise));
cdm_->SetServerCertificate( cdm_->SetServerCertificate(
certificate, certificate,
...@@ -273,6 +284,8 @@ void FuchsiaCdm::CreateSessionAndGenerateRequest( ...@@ -273,6 +284,8 @@ void FuchsiaCdm::CreateSessionAndGenerateRequest(
return; return;
} }
REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm_);
uint32_t promise_id = promises_.SavePromise(std::move(promise)); uint32_t promise_id = promises_.SavePromise(std::move(promise));
auto session = std::make_unique<CdmSession>(&session_callbacks_); auto session = std::make_unique<CdmSession>(&session_callbacks_);
...@@ -344,6 +357,8 @@ void FuchsiaCdm::UpdateSession(const std::string& session_id, ...@@ -344,6 +357,8 @@ void FuchsiaCdm::UpdateSession(const std::string& session_id,
return; return;
} }
REJECT_PROMISE_AND_RETURN_IF_BAD_CDM(promise, cdm_);
// Caller should NOT pass in an empty response. // Caller should NOT pass in an empty response.
DCHECK(!response.empty()); DCHECK(!response.empty());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment