diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-03-12 19:46:59 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-03-17 00:36:35 -0700 |
commit | 8e9d4431d6a97a08d7dc9612c68ffd0812dfdc68 (patch) | |
tree | 37fbaf7f7503d8269dc8bedf7d3d153b8e475314 /services | |
parent | 0837fde9fd9e29f8ef66a3fe00764e15a6f3d515 (diff) | |
download | frameworks_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.cpp | 30 |
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; } |