From 07bb4de0427047076ba54ce2b2dd4eb32759e840 Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Fri, 13 Apr 2018 01:12:16 -0700 Subject: [PATCH] Prevent race conditions between decrypt and close session [ Merge of http://go/wvgerrit/47520 ] Bug: 73781703 Test: WV unit/integration tests, GTS GtsMediaTestCases tests and AUPT tests. Change-Id: I618ed8ca38855aecdb31e829a7f4041cbd505a02 --- libwvdrmengine/cdm/core/include/cdm_session.h | 5 ++++- libwvdrmengine/cdm/core/include/wv_cdm_types.h | 1 + libwvdrmengine/cdm/core/src/cdm_session.cpp | 11 ++++++++++- libwvdrmengine/cdm/core/test/test_printers.cpp | 2 ++ libwvdrmengine/include/mapErrors-inl.h | 1 + libwvdrmengine/include_hidl/mapErrors-inl.h | 1 + 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/cdm_session.h b/libwvdrmengine/cdm/core/include/cdm_session.h index 113c9e96..854f459d 100644 --- a/libwvdrmengine/cdm/core/include/cdm_session.h +++ b/libwvdrmengine/cdm/core/include/cdm_session.h @@ -37,7 +37,7 @@ class CdmSession { CdmSession(FileSystem* file_system, metrics::SessionMetrics* metrics); virtual ~CdmSession(); - void Close() { closed_ = true; } + void Close(); bool IsClosed() { return closed_; } // Initializes this instance of CdmSession with the given property set. @@ -263,6 +263,9 @@ class CdmSession { bool mock_license_parser_in_use_; bool mock_policy_engine_in_use_; + // Lock to avoid race conditions between Close() and Decrypt() + Lock close_lock_; + CORE_DISALLOW_COPY_AND_ASSIGN(CdmSession); }; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index bead3941..19fc6310 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -333,6 +333,7 @@ enum CdmResponseType { GET_PROVISIONING_METHOD_ERROR = 289, SESSION_NOT_FOUND_17 = 290, SESSION_NOT_FOUND_18 = 291, + SESSION_CLOSED_1 = 292, }; enum CdmKeyStatus { diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index f66ae08d..26267110 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -66,6 +66,11 @@ CdmSession::~CdmSession() { } } +void CdmSession::Close() { + AutoLock lock(close_lock_); + closed_ = true; +} + CdmResponseType CdmSession::Init( CdmClientPropertySet* cdm_client_property_set) { return Init(cdm_client_property_set, NULL, NULL); @@ -567,10 +572,14 @@ CdmResponseType CdmSession::QueryOemCryptoSessionId( // Decrypt() - Accept encrypted buffer and return decrypted data. CdmResponseType CdmSession::Decrypt(const CdmDecryptionParameters& params) { if (!initialized_) { - LOGE("CdmSession::Decrypt: not initialized"); return NOT_INITIALIZED_ERROR; } + AutoLock lock(close_lock_); + if (IsClosed()) { + return SESSION_CLOSED_1; + } + // Playback may not begin until either the start time passes or the license // is updated, so we treat this Decrypt call as invalid. if (params.is_encrypted) { diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 475c5f89..0dc40bf6 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -599,6 +599,8 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case SESSION_NOT_FOUND_18: *os << "SESSION_NOT_FOUND_18"; break; + case SESSION_CLOSED_1: *os << "SESSION_CLOSED_1"; + break; default: *os << "Unknown CdmResponseType"; break; diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index 029c11d9..8ebc454a 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -230,6 +230,7 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::SESSION_NOT_FOUND_10: case wvcdm::SESSION_NOT_FOUND_17: case wvcdm::SESSION_NOT_FOUND_18: + case wvcdm::SESSION_CLOSED_1: return android::ERROR_DRM_SESSION_NOT_OPENED; case wvcdm::SESSION_KEYS_NOT_FOUND: return kSessionKeysNotFound; diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index 1637e626..18503efb 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -58,6 +58,7 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::SESSION_NOT_FOUND_10: case wvcdm::SESSION_NOT_FOUND_17: case wvcdm::SESSION_NOT_FOUND_18: + case wvcdm::SESSION_CLOSED_1: return Status::ERROR_DRM_SESSION_NOT_OPENED; case wvcdm::DECRYPT_ERROR: