@@ -304,6 +304,17 @@ class IAHWC2 : public hwc2_device_t {
304304 return HWC2::Error::BadDisplay;
305305 }
306306
307+ bool IsValidDisplay (HwcDisplay *display) {
308+ if (!display) {
309+ return false ;
310+ }
311+ hwcomposer::NativeDisplay *native_display = display->GetDisplay ();
312+ if (!(native_display && native_display->IsConnected ())) {
313+ return false ;
314+ }
315+ return true ;
316+ }
317+
307318 static IAHWC2 *toIAHWC2 (hwc2_device_t *dev) {
308319 return static_cast <IAHWC2 *>(dev);
309320 }
@@ -346,12 +357,19 @@ class IAHWC2 : public hwc2_device_t {
346357
347358 if (display_handle == HWC_DISPLAY_EXTERNAL) {
348359 HwcDisplay *display = hwc->extended_displays_ .at (0 ).get ();
349- return static_cast <int32_t >(
350- (display->*func)(std::forward<Args>(args)...));
360+ if (!hwc->IsValidDisplay (display))
361+ return static_cast <int32_t >(hwc->BadDisplay ());
362+ else
363+ return static_cast <int32_t >(
364+ (display->*func)(std::forward<Args>(args)...));
351365 }
352366
353367 HwcDisplay *display = hwc->extended_displays_ .at (1 ).get ();
354- return static_cast <int32_t >((display->*func)(std::forward<Args>(args)...));
368+ if (!hwc->IsValidDisplay (display))
369+ return static_cast <int32_t >(hwc->BadDisplay ());
370+ else
371+ return static_cast <int32_t >(
372+ (display->*func)(std::forward<Args>(args)...));
355373 }
356374
357375 template <typename HookType, HookType func, typename ... Args>
@@ -376,13 +394,21 @@ class IAHWC2 : public hwc2_device_t {
376394
377395 if (display_handle == HWC_DISPLAY_EXTERNAL) {
378396 HwcDisplay *display = hwc->extended_displays_ .at (0 ).get ();
379- Hwc2Layer &layer = display->get_layer (layer_handle);
380- return static_cast <int32_t >((layer.*func)(std::forward<Args>(args)...));
397+ if (!hwc->IsValidDisplay (display)) {
398+ return static_cast <int32_t >(hwc->BadDisplay ());
399+ } else {
400+ Hwc2Layer &layer = display->get_layer (layer_handle);
401+ return static_cast <int32_t >((layer.*func)(std::forward<Args>(args)...));
402+ }
381403 }
382404
383405 HwcDisplay *display = hwc->extended_displays_ .at (1 ).get ();
384- Hwc2Layer &layer = display->get_layer (layer_handle);
385- return static_cast <int32_t >((layer.*func)(std::forward<Args>(args)...));
406+ if (!hwc->IsValidDisplay (display)) {
407+ return static_cast <int32_t >(hwc->BadDisplay ());
408+ } else {
409+ Hwc2Layer &layer = display->get_layer (layer_handle);
410+ return static_cast <int32_t >((layer.*func)(std::forward<Args>(args)...));
411+ }
386412 }
387413
388414 // hwc2_device_t hooks
0 commit comments