From 22d9160219f662cf600f23f447ed56fa0003e1a2 Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Sun, 1 Jul 2018 12:19:52 -0700 Subject: [PATCH] Revert of "Prevent race conditions between decrypt and close session" Merge from Widevine repo of http://go/wvgerrit/50481 Original CL http://go/wvgerrit/47520 The original CL was not completely merged to master on Android, so this CL only reverts the left-over bits. The original fix was not sufficient to address all race conditions. A subsequent CL will address them. Bug: 73781703 Bug: 79158083 Bug: 79262108 Test: tested as part of http://go/ag/4674759 Change-Id: Ib6c55ab5434e08fe61e0f65623ac8c7b2dc5aaa1 --- libwvdrmengine/cdm/core/include/wv_cdm_types.h | 1 + libwvdrmengine/cdm/core/src/cdm_session_map.cpp | 10 ++++++---- libwvdrmengine/cdm/core/test/test_printers.cpp | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index a2a4ef23..389dc2b6 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, + /* Error code 292 can be reused as it was never present in a release */ DEVICE_CANNOT_REPROVISION = 293, SESSION_NOT_FOUND_19 = 294, }; diff --git a/libwvdrmengine/cdm/core/src/cdm_session_map.cpp b/libwvdrmengine/cdm/core/src/cdm_session_map.cpp index e94a3173..8f8b2bf0 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session_map.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session_map.cpp @@ -12,10 +12,7 @@ namespace wvcdm { CdmSessionMap::~CdmSessionMap() { - Terminate(); -} - -void CdmSessionMap::Terminate() { + AutoLock lock(lock_); for (CdmIdToSessionMap::iterator i = sessions_.begin(); i != sessions_.end(); ++i) { i->second->Close(); @@ -25,10 +22,12 @@ void CdmSessionMap::Terminate() { } void CdmSessionMap::Add(const std::string& id, CdmSession* session) { + AutoLock lock(lock_); sessions_[id].reset(session); } bool CdmSessionMap::CloseSession(const std::string& id) { + AutoLock lock(lock_); shared_ptr session; if (!FindSessionNoLock(id, &session)) { return false; @@ -39,11 +38,13 @@ bool CdmSessionMap::CloseSession(const std::string& id) { } bool CdmSessionMap::Exists(const std::string& id) { + AutoLock lock(lock_); return sessions_.find(id) != sessions_.end(); } bool CdmSessionMap::FindSession(const CdmSessionId& id, shared_ptr* session) { + AutoLock lock(lock_); return FindSessionNoLock(id, session); } @@ -60,6 +61,7 @@ bool CdmSessionMap::FindSessionNoLock(const CdmSessionId& session_id, void CdmSessionMap::GetSessionList(CdmSessionList& sessions) { sessions.clear(); + AutoLock lock(lock_); for (CdmIdToSessionMap::iterator iter = sessions_.begin(); iter != sessions_.end(); ++iter) { if (!(iter->second)->IsClosed()) { diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 574dccf8..582e7928 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -599,10 +599,10 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case SESSION_NOT_FOUND_18: *os << "SESSION_NOT_FOUND_18"; break; - case DEVICE_CANNOT_REPROVISION: *os << "DEVICE_CANNOT_REPROVISION"; - break; case SESSION_NOT_FOUND_19: *os << "SESSION_NOT_FOUND_19"; break; + case DEVICE_CANNOT_REPROVISION: *os << "DEVICE_CANNOT_REPROVISION"; + break; default: *os << "Unknown CdmResponseType"; break;