diff options
author | Phil Burk <philburk@google.com> | 2016-04-18 16:05:28 -0700 |
---|---|---|
committer | Phil Burk <philburk@google.com> | 2016-04-18 16:45:22 -0700 |
commit | 042e67a90ae18196e9a1126adfdf0f1b8c6a4333 (patch) | |
tree | b1ca52960f0d5914e8a5ad7c853702491de20f57 /services/midi | |
parent | b2e4e98e7c2b54966b48945a0418187564d71085 (diff) |
MidiService: fix resource leak
The proxy object was being used to match when adding or removing objects.
But they are different each time. So now we use an asBinder() object.
Bug: 28153736
Change-Id: I1bccebf1e9464668db757ff08b41902d0cf0e3a7
Signed-off-by: Phil Burk <philburk@google.com>
Diffstat (limited to 'services/midi')
-rw-r--r-- | services/midi/java/com/android/server/midi/MidiService.java | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index c6d5a7e268b7..723be2481d6f 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -126,8 +126,8 @@ public class MidiService extends IMidiManager.Stub { // This client's PID private final int mPid; // List of all receivers for this client - private final ArrayList<IMidiDeviceListener> mListeners - = new ArrayList<IMidiDeviceListener>(); + private final HashMap<IBinder, IMidiDeviceListener> mListeners + = new HashMap<IBinder, IMidiDeviceListener>(); // List of all device connections for this client private final HashMap<IBinder, DeviceConnection> mDeviceConnections = new HashMap<IBinder, DeviceConnection>(); @@ -143,11 +143,13 @@ public class MidiService extends IMidiManager.Stub { } public void addListener(IMidiDeviceListener listener) { - mListeners.add(listener); + // Use asBinder() so that we can match it in removeListener(). + // The listener proxy objects themselves do not match. + mListeners.put(listener.asBinder(), listener); } public void removeListener(IMidiDeviceListener listener) { - mListeners.remove(listener); + mListeners.remove(listener.asBinder()); if (mListeners.size() == 0 && mDeviceConnections.size() == 0) { close(); } @@ -184,7 +186,7 @@ public class MidiService extends IMidiManager.Stub { MidiDeviceInfo deviceInfo = device.getDeviceInfo(); try { - for (IMidiDeviceListener listener : mListeners) { + for (IMidiDeviceListener listener : mListeners.values()) { listener.onDeviceAdded(deviceInfo); } } catch (RemoteException e) { @@ -198,7 +200,7 @@ public class MidiService extends IMidiManager.Stub { MidiDeviceInfo deviceInfo = device.getDeviceInfo(); try { - for (IMidiDeviceListener listener : mListeners) { + for (IMidiDeviceListener listener : mListeners.values()) { listener.onDeviceRemoved(deviceInfo); } } catch (RemoteException e) { @@ -211,7 +213,7 @@ public class MidiService extends IMidiManager.Stub { if (!device.isUidAllowed(mUid)) return; try { - for (IMidiDeviceListener listener : mListeners) { + for (IMidiDeviceListener listener : mListeners.values()) { listener.onDeviceStatusChanged(status); } } catch (RemoteException e) { |