SF: Do not deref empty std::optional<PowerMode>
In I3a2eae4efc4a5c6113700a9ca9e9b261e364a878, a display's power mode is
std::nullopt (unknown) until the first setPowerMode. The condition to
power on the display from that state relies on undefined behavior, as
it dereferences std::nullopt. It only works because PowerMode::OFF is
0 and the memory happens to be zeroed.
Bug: 250421145
Test: Boot
Change-Id: I0db8970b37da6eb308043157cd2ac7a9f6764294
Merged-In: I0db8970b37da6eb308043157cd2ac7a9f6764294
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 4486e33..a701fe3 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4888,7 +4888,7 @@
mInterceptor->savePowerModeUpdate(display->getSequenceId(), static_cast<int32_t>(mode));
}
const auto refreshRate = display->refreshRateConfigs().getActiveMode()->getFps();
- if (*currentMode == hal::PowerMode::OFF) {
+ if (!currentMode || *currentMode == hal::PowerMode::OFF) {
// Turn on the display
if (display->isInternal() && (!activeDisplay || !activeDisplay->isPoweredOn())) {
onActiveDisplayChangedLocked(display);