Merge "Check security-level during OpenSession." into sc-widevine-release

This commit is contained in:
TreeHugger Robot
2021-12-13 20:10:07 +00:00
committed by Android (Google) Code Review

View File

@@ -121,41 +121,50 @@ CdmResponseType CdmEngine::OpenSession(const CdmKeySystem& key_system,
} }
LOGD("forced_session_id = %s", IdPtrToString(forced_session_id)); LOGD("forced_session_id = %s", IdPtrToString(forced_session_id));
} }
SecurityLevel requested_security_level = kLevelDefault;
if (property_set &&
property_set->security_level() == QUERY_VALUE_SECURITY_LEVEL_L3) {
requested_security_level = kLevel3;
}
bool forced_level3 = false; bool forced_level3 = false;
if (OkpCheck()) { if (requested_security_level == kLevelDefault) {
bool okp_provisioned = false; if (OkpCheck()) {
bool fallback = false; bool okp_provisioned = false;
{ bool fallback = false;
std::unique_lock<std::mutex> lock(okp_mutex_); {
if (!okp_provisioner_) { std::unique_lock<std::mutex> lock(okp_mutex_);
// Very rare race condition. Possible if two calls to OpenSession if (!okp_provisioner_) {
// occur the same time. Cleanup would have been performed. // Very rare race condition. Possible if two calls to OpenSession
if (okp_fallback_) { // occur the same time. Cleanup would have been performed.
fallback = true; if (okp_fallback_) {
} else { fallback = true;
} else {
okp_provisioned = true;
}
} else if (okp_provisioner_->IsProvisioned()) {
okp_provisioned = true; okp_provisioned = true;
} else if (okp_provisioner_->IsInFallbackMode()) {
fallback = true;
} }
} else if (okp_provisioner_->IsProvisioned()) {
okp_provisioned = true;
} else if (okp_provisioner_->IsInFallbackMode()) {
fallback = true;
} }
} if (okp_provisioned) {
if (okp_provisioned) { // OKP not required, engine may assume normal operations.
// OKP not required, engine may assume normal operations. OkpCleanUp();
OkpCleanUp(); } else if (fallback) {
} else if (fallback) { LOGD("Engine is falling back to L3");
LOGD("Engine is falling back to L3"); OkpTriggerFallback();
OkpTriggerFallback(); forced_level3 = true;
forced_level3 = true; } else {
// OKP is required.
return NEED_PROVISIONING;
}
} else { } else {
// OKP is required. std::unique_lock<std::mutex> lock(okp_mutex_);
return NEED_PROVISIONING; // |okp_fallback_| would have been set previously if required.
if (okp_fallback_) forced_level3 = true;
} }
} else {
std::unique_lock<std::mutex> lock(okp_mutex_);
// |okp_fallback_| would have been set previously if required.
if (okp_fallback_) forced_level3 = true;
} }
CloseExpiredReleaseSessions(); CloseExpiredReleaseSessions();