OSDN Git Service

Fix resource leaks in drm hal
authorJeff Tinker <jtinker@google.com>
Tue, 9 May 2017 02:27:10 +0000 (19:27 -0700)
committerJeff Tinker <jtinker@google.com>
Tue, 9 May 2017 18:24:49 +0000 (11:24 -0700)
bug:36408047
test: manual tests to verify leaks are fixed
Change-Id: Idd79e99e211d81f8b3e58cf52c9b01ce9d370dc4

drm/1.0/default/CryptoPlugin.h
drm/1.0/default/DrmFactory.cpp
drm/1.0/default/DrmPlugin.cpp
drm/1.0/default/DrmPlugin.h

index 11cc2aa..5da469c 100644 (file)
@@ -44,7 +44,7 @@ using ::android::sp;
 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.
index 7e5d998..05951d7 100644 (file)
@@ -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
index 1695ef7..1feec0a 100644 (file)
@@ -327,24 +327,27 @@ namespace implementation {
 
     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 @@ namespace implementation {
         }
         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 @@ namespace implementation {
             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
index dce6c0c..d951c92 100644 (file)
@@ -46,7 +46,7 @@ using ::android::sp;
 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 @@ struct DrmPlugin : public IDrmPlugin, android::DrmPluginListener {
 
 private:
     android::DrmPlugin *mLegacyPlugin;
-    sp<IDrmPluginListener> mListener;
+    wp<IDrmPluginListener> mListener;
 
     DrmPlugin() = delete;
     DrmPlugin(const DrmPlugin &) = delete;