From e28f98cc827e1759a9c33b517f3c2dec5b882722 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Sat, 4 Sep 2021 01:31:02 -0700 Subject: [PATCH] Properly close plugins on SIGTERM and exit test: adb reboot while playing netflix and check logcat to make sure session are closed. [ Merge of http://go/wvgerrit/133063 ] bug: 193099676 Change-Id: I375695673b0c366e09fb857f5ae7a9cb6b946779 --- .../mediadrm/include_hidl/WVDrmPlugin.h | 46 +++++++++++++++++++ .../mediadrm/src_hidl/WVDrmPlugin.cpp | 9 +++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h index fb22e34b..c4c77b83 100644 --- a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h @@ -8,6 +8,7 @@ #define WV_DRM_PLUGIN_H_ #include +#include #include "cdm_client_property_set.h" #include "cdm_identifier.h" @@ -18,6 +19,7 @@ #include "HidlTypes.h" #include "WVGenericCryptoInterface.h" #include "WVTypes.h" +#include namespace wvdrm { namespace hardware { @@ -26,6 +28,7 @@ namespace V1_4 { namespace widevine { using std::map; +using android::Mutex; using wvcdm::CdmIdentifier; using wvcdm::CdmKeyStatusMap; using wvcdm::CdmSessionId; @@ -45,6 +48,8 @@ struct WVDrmPlugin : public ::drm::V1_4::IDrmPlugin, IDrmPluginListener, virtual ~WVDrmPlugin(); + void Close(); + Return openSession(openSession_cb _hidl_cb) override; Return openSession_1_1(SecurityLevel securityLevel, openSession_1_1_cb _hidl_cb) override; @@ -450,6 +455,47 @@ struct WVDrmPlugin : public ::drm::V1_4::IDrmPlugin, IDrmPluginListener, uint32_t getNextUniqueId(); } mCdmIdentifierBuilder; + // Properly close plugins on SIGTERM then exit + class Terminator { + public: + static void Register(WVDrmPlugin* plugin) { instance().DoRegister(plugin); } + static void Forget(WVDrmPlugin* plugin) { instance().DoForget(plugin); } + static void Terminate(int /*signal*/) { instance().DoTerminate(); } + + private: + WVDRM_DISALLOW_COPY_AND_ASSIGN(Terminator); + + Terminator() { + signal(SIGTERM, Terminate); + } + + static Terminator& instance() { + static Terminator instance; + return instance; + } + + void DoRegister(WVDrmPlugin* plugin) { + Mutex::Autolock lock(mLock); + mPlugins.push_back(plugin); + } + + void DoForget(WVDrmPlugin* plugin) { + Mutex::Autolock lock(mLock); + mPlugins.remove(plugin); + } + + void DoTerminate() { + Mutex::Autolock lock(mLock); + for_each(mPlugins.begin(), mPlugins.end(), [] (WVDrmPlugin* plugin) { + plugin->Close(); + }); + exit(0); + } + + std::list mPlugins; + Mutex mLock; + }; + sp const mCDM; WVGenericCryptoInterface* mCrypto; map mCryptoSessions; diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index abb2af61..cb680fff 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -196,10 +196,17 @@ WVDrmPlugin::WVDrmPlugin(const sp& cdm, mCDM(cdm), mCrypto(crypto), mCryptoSessions(), - mAppPackageName(appPackageName) {} + mAppPackageName(appPackageName) { + Terminator::Register(this); +} WVDrmPlugin::~WVDrmPlugin() { wvcdm::SetLoggingUid(mCdmIdentifierBuilder.user_id()); + Terminator::Forget(this); + Close(); +} + +void WVDrmPlugin::Close() { typedef map::iterator mapIterator; for (mapIterator iter = mCryptoSessions.begin(); iter != mCryptoSessions.end();