From 006506278a104bbf8edd1a3eb2c2de75094e6d91 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Tue, 9 May 2017 14:31:07 -0700 Subject: [PATCH] Fix widevine drm hal resource leaks A strong pointer cycle was preventing the drm plugin from being released. This change converts the listener to a weak pointer to break the cycle. bug:36408047 test: manual testing to verify leaks are fixed Change-Id: I2e2af392c2b263b7b0943d61dcaee5e94089ce27 --- .../mediadrm/include_hidl/WVDrmPlugin.h | 3 ++- libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h index 1aa89a46..e14e3588 100644 --- a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h @@ -38,6 +38,7 @@ using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; using ::android::hardware::Return; using ::android::sp; +using ::android::wp; using android::status_t; using std::map; @@ -350,7 +351,7 @@ struct WVDrmPlugin : public IDrmPlugin, IDrmPluginListener, sp const mCDM; WVGenericCryptoInterface* mCrypto; map mCryptoSessions; - sp mListener; + wp mListener; status_t queryProperty(const std::string& property, std::string& stringValue) const; diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index bcbe9903..1dee072d 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -1122,8 +1122,9 @@ Return WVDrmPlugin::setListener(const sp& listener) { Return WVDrmPlugin::sendEvent( EventType eventType, const hidl_vec& sessionId, const hidl_vec& data) { - if (mListener != NULL) { - mListener->sendEvent(eventType, sessionId, data); + auto listener = mListener.promote(); + if (listener != NULL) { + listener->sendEvent(eventType, sessionId, data); } else { ALOGE("Null event listener, event not sent"); } @@ -1133,8 +1134,9 @@ Return WVDrmPlugin::sendEvent( Return WVDrmPlugin::sendExpirationUpdate( const hidl_vec& sessionId, int64_t expiryTimeInMS) { - if (mListener != NULL) { - mListener->sendExpirationUpdate(sessionId, expiryTimeInMS); + auto listener = mListener.promote(); + if (listener != NULL) { + listener->sendExpirationUpdate(sessionId, expiryTimeInMS); } else { ALOGE("Null event listener, event not sent"); } @@ -1144,8 +1146,9 @@ Return WVDrmPlugin::sendExpirationUpdate( Return WVDrmPlugin::sendKeysChange( const hidl_vec& sessionId, const hidl_vec& keyStatusList, bool hasNewUsableKey) { - if (mListener != NULL) { - mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); + auto listener = mListener.promote(); + if (listener != NULL) { + listener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); } else { ALOGE("Null event listener, event not sent"); }