Fix resource leaks in drm hal

bug:36408047
test: manual tests to verify leaks are fixed
Change-Id: Idd79e99e211d81f8b3e58cf52c9b01ce9d370dc4
diff --git a/drm/1.0/default/CryptoPlugin.h b/drm/1.0/default/CryptoPlugin.h
index 11cc2aa..5da469c 100644
--- a/drm/1.0/default/CryptoPlugin.h
+++ b/drm/1.0/default/CryptoPlugin.h
@@ -44,7 +44,7 @@
 struct CryptoPlugin : public ICryptoPlugin {
     CryptoPlugin(android::CryptoPlugin *plugin) : mLegacyPlugin(plugin) {}
 
-    ~CryptoPlugin() {delete mLegacyPlugin;}
+    virtual ~CryptoPlugin() {delete mLegacyPlugin;}
 
     // Methods from ::android::hardware::drm::V1_0::ICryptoPlugin
     // follow.
diff --git a/drm/1.0/default/DrmFactory.cpp b/drm/1.0/default/DrmFactory.cpp
index 7e5d998..05951d7 100644
--- a/drm/1.0/default/DrmFactory.cpp
+++ b/drm/1.0/default/DrmFactory.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
-` *
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
diff --git a/drm/1.0/default/DrmPlugin.cpp b/drm/1.0/default/DrmPlugin.cpp
index 1695ef7..1feec0a 100644
--- a/drm/1.0/default/DrmPlugin.cpp
+++ b/drm/1.0/default/DrmPlugin.cpp
@@ -327,24 +327,27 @@
 
     Return<void> DrmPlugin::sendEvent(EventType eventType,
             const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) {
-        if (mListener != nullptr) {
-            mListener->sendEvent(eventType, sessionId, data);
+        auto listener = mListener.promote();
+        if (listener != nullptr) {
+            listener->sendEvent(eventType, sessionId, data);
         }
         return Void();
     }
 
     Return<void> DrmPlugin::sendExpirationUpdate(
             const hidl_vec<uint8_t>& sessionId, int64_t expiryTimeInMS) {
-        if (mListener != nullptr) {
-            mListener->sendExpirationUpdate(sessionId, expiryTimeInMS);
+        auto listener = mListener.promote();
+        if (listener != nullptr) {
+            listener->sendExpirationUpdate(sessionId, expiryTimeInMS);
         }
         return Void();
     }
 
     Return<void> DrmPlugin::sendKeysChange(const hidl_vec<uint8_t>& sessionId,
             const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) {
-        if (mListener != nullptr) {
-            mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey);
+        auto listener = mListener.promote();
+        if (listener != nullptr) {
+            listener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey);
         }
         return Void();
     }
@@ -380,15 +383,21 @@
         }
         if (sendEvent) {
             Vector<uint8_t> emptyVector;
-            mListener->sendEvent(eventType,
-                    toHidlVec(sessionId == NULL ? emptyVector: *sessionId),
-                    toHidlVec(data == NULL ? emptyVector: *data));
+            auto listener = mListener.promote();
+            if (listener != nullptr) {
+                listener->sendEvent(eventType,
+                        toHidlVec(sessionId == NULL ? emptyVector: *sessionId),
+                        toHidlVec(data == NULL ? emptyVector: *data));
+            }
         }
     }
 
     void DrmPlugin::sendExpirationUpdate(Vector<uint8_t> const *sessionId,
             int64_t expiryTimeInMS) {
-        mListener->sendExpirationUpdate(toHidlVec(*sessionId), expiryTimeInMS);
+        auto listener = mListener.promote();
+        if (listener != nullptr) {
+            listener->sendExpirationUpdate(toHidlVec(*sessionId), expiryTimeInMS);
+        }
     }
 
     void DrmPlugin::sendKeysChange(Vector<uint8_t> const *sessionId,
@@ -424,8 +433,11 @@
             keyStatus.keyId = toHidlVec(legacyKeyStatus.mKeyId);
             keyStatusVec.push_back(keyStatus);
         }
-        mListener->sendKeysChange(toHidlVec(*sessionId),
-                toHidlVec(keyStatusVec), hasNewUsableKey);
+        auto listener = mListener.promote();
+        if (listener != nullptr) {
+            listener->sendKeysChange(toHidlVec(*sessionId),
+                    toHidlVec(keyStatusVec), hasNewUsableKey);
+        }
     }
 
 }  // namespace implementation
diff --git a/drm/1.0/default/DrmPlugin.h b/drm/1.0/default/DrmPlugin.h
index dce6c0c..d951c92 100644
--- a/drm/1.0/default/DrmPlugin.h
+++ b/drm/1.0/default/DrmPlugin.h
@@ -46,7 +46,7 @@
 struct DrmPlugin : public IDrmPlugin, android::DrmPluginListener {
 
     DrmPlugin(android::DrmPlugin *plugin) : mLegacyPlugin(plugin) {}
-    ~DrmPlugin() {delete mLegacyPlugin;}
+    virtual ~DrmPlugin() {delete mLegacyPlugin;}
 
     // Methods from ::android::hardware::drm::V1_0::IDrmPlugin follow.
 
@@ -153,7 +153,7 @@
 
 private:
     android::DrmPlugin *mLegacyPlugin;
-    sp<IDrmPluginListener> mListener;
+    wp<IDrmPluginListener> mListener;
 
     DrmPlugin() = delete;
     DrmPlugin(const DrmPlugin &) = delete;