summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-03-12 19:46:59 -0800
committerJeff Brown <jeffbrown@google.com>2011-03-17 00:36:35 -0700
commit8e9d4431d6a97a08d7dc9612c68ffd0812dfdc68 (patch)
tree37fbaf7f7503d8269dc8bedf7d3d153b8e475314 /services
parent0837fde9fd9e29f8ef66a3fe00764e15a6f3d515 (diff)
downloadframeworks_base-8e9d4431d6a97a08d7dc9612c68ffd0812dfdc68.zip
frameworks_base-8e9d4431d6a97a08d7dc9612c68ffd0812dfdc68.tar.gz
frameworks_base-8e9d4431d6a97a08d7dc9612c68ffd0812dfdc68.tar.bz2
Fix dangling pointer when device closed just after opening.
Bug: 4088239 Change-Id: I210b918370357560a5ace8ea8dd7601255487e88
Diffstat (limited to 'services')
-rw-r--r--services/input/EventHub.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp
index e2da740..853dda4 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -1074,8 +1074,34 @@ int EventHub::closeDeviceAtIndexLocked(int index) {
mDevices.removeAt(index);
device->close();
- device->next = mClosingDevices;
- mClosingDevices = device;
+ // Unlink for opening devices list if it is present.
+ Device* pred = NULL;
+ bool found = false;
+ for (Device* entry = mOpeningDevices; entry != NULL; ) {
+ if (entry == device) {
+ found = true;
+ break;
+ }
+ pred = entry;
+ entry = entry->next;
+ }
+ if (found) {
+ // Unlink the device from the opening devices list then delete it.
+ // We don't need to tell the client that the device was closed because
+ // it does not even know it was opened in the first place.
+ LOGI("Device %s was immediately closed after opening.", device->path.string());
+ if (pred) {
+ pred->next = device->next;
+ } else {
+ mOpeningDevices = device->next;
+ }
+ delete device;
+ } else {
+ // Link into closing devices list.
+ // The device will be deleted later after we have informed the client.
+ device->next = mClosingDevices;
+ mClosingDevices = device;
+ }
return 0;
}