SurfaceFlinger: Avoid calling to SystemServer with lock held
Added missing case when setting inputinfo
see 14167e00b52f59901e5cff816cf60e7fe2401c88 for more details
Bug: 124281288
Test: Existing tests pass
Change-Id: Ief2ccf8d2720a5d44f2c3fdaca7354789e2e5586
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index cd63a0e..777f69b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3992,7 +3992,7 @@
if (layer->setSidebandStream(s.sidebandStream)) flags |= eTraversalNeeded;
}
if (what & layer_state_t::eInputInfoChanged) {
- if (callingThreadHasUnscopedSurfaceFlingerAccess()) {
+ if (privileged) {
layer->setInputInfo(s.inputInfo);
flags |= eTraversalNeeded;
} else {
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 8f80175..2e3d5d3 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -585,8 +585,9 @@
bool containsAnyInvalidClientState(const Vector<ComposerState>& states);
bool transactionIsReadyToBeApplied(int64_t desiredPresentTime,
const Vector<ComposerState>& states);
- uint32_t setClientStateLocked(const ComposerState& composerState, bool privileged);
- uint32_t setDisplayStateLocked(const DisplayState& s);
+ uint32_t setClientStateLocked(const ComposerState& composerState, bool privileged)
+ REQUIRES(mStateLock);
+ uint32_t setDisplayStateLocked(const DisplayState& s) REQUIRES(mStateLock);
uint32_t addInputWindowCommands(const InputWindowCommands& inputWindowCommands)
REQUIRES(mStateLock);
diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
index d61973e..b63e5d5 100644
--- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
+++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
@@ -257,7 +257,10 @@
return mFlinger->onHotplugReceived(sequenceId, display, connection);
}
- auto setDisplayStateLocked(const DisplayState& s) { return mFlinger->setDisplayStateLocked(s); }
+ auto setDisplayStateLocked(const DisplayState& s) {
+ Mutex::Autolock _l(mFlinger->mStateLock);
+ return mFlinger->setDisplayStateLocked(s);
+ }
// Allow reading display state without locking, as if called on the SF main thread.
auto onInitializeDisplays() NO_THREAD_SAFETY_ANALYSIS {