Merge "Fix crash on hotplug disconnect"
diff --git a/graphics/composer/2.1/default/ComposerClient.cpp b/graphics/composer/2.1/default/ComposerClient.cpp
index 4e6dd4f..8aa9af0 100644
--- a/graphics/composer/2.1/default/ComposerClient.cpp
+++ b/graphics/composer/2.1/default/ComposerClient.cpp
@@ -299,10 +299,17 @@
Error err = mHal.createLayer(display, &layer);
if (err == Error::NONE) {
std::lock_guard<std::mutex> lock(mDisplayDataMutex);
-
auto dpy = mDisplayData.find(display);
- auto ly = dpy->second.Layers.emplace(layer, LayerBuffers()).first;
- ly->second.Buffers.resize(bufferSlotCount);
+ // The display entry may have already been removed by onHotplug.
+ if (dpy != mDisplayData.end()) {
+ auto ly = dpy->second.Layers.emplace(layer, LayerBuffers()).first;
+ ly->second.Buffers.resize(bufferSlotCount);
+ } else {
+ err = Error::BAD_DISPLAY;
+ // Note: We do not destroy the layer on this error as the hotplug
+ // disconnect invalidates the display id. The implementation should
+ // ensure all layers for the display are destroyed.
+ }
}
hidl_cb(err, layer);
@@ -316,7 +323,10 @@
std::lock_guard<std::mutex> lock(mDisplayDataMutex);
auto dpy = mDisplayData.find(display);
- dpy->second.Layers.erase(layer);
+ // The display entry may have already been removed by onHotplug.
+ if (dpy != mDisplayData.end()) {
+ dpy->second.Layers.erase(layer);
+ }
}
return err;