diff options
author | Lloyd Pique <lpique@google.com> | 2018-10-09 11:53:39 -0700 |
---|---|---|
committer | Lloyd Pique <lpique@google.com> | 2018-10-09 12:22:52 -0700 |
commit | 08c66224767ece5fd16d31a34f46d77eed4f7c56 (patch) | |
tree | a3870886605d2a77f7590d91653ec60dde116fee | |
parent | d7cf7f4f02900bdfc8374366039a210e61c4e1f7 (diff) | |
download | native-08c66224767ece5fd16d31a34f46d77eed4f7c56.tar.gz |
[SF] Fix unittest crash
(Manual cherrypick to aosp)
Some of the values passed to HWC2::Display by FakeHwcDisplayInjector as
used by the test were passed by reference, with the reference being
owned by the injector.
However, the lifetime of the injector was effectively temporary, and so
the constructed Display instance ended up holding a reference to a dead
instance.
This patch uses statically constructed default values for those
parameters instead, so that the values will not be destroyed. The test
code can also still override the values used if non-default values are
ever desired.
It also adds a comment warning of the possibility so it hopefully does
not happen again.
Bug: 111454533
Bug: 117451794
Test: atest libsurfaceflinger_unittest # On aosp_cf_x86_phone-userdebug
Change-Id: I8dfe6e31111a558a7892f0eef91bd96b8dd71f59
Merged-In: I8dfe6e31111a558a7892f0eef91bd96b8dd71f59
-rw-r--r-- | services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index f1556d8bc7..eec505ec58 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -211,13 +211,20 @@ public: return *this; } - auto& addCapability(HWC2::Capability cap) { - mCapabilities.emplace(cap); + auto& setCapabilities(const std::unordered_set<HWC2::Capability>* capabilities) { + mCapabilities = capabilities; return *this; } void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) { - auto display = std::make_unique<HWC2Display>(*composer, mCapabilities, mHwcDisplayId, + static const std::unordered_set<HWC2::Capability> defaultCapabilities; + if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities; + + // Caution - Make sure that any values passed by reference here do + // not refer to an instance owned by FakeHwcDisplayInjector. This + // class has temporary lifetime, while the constructed HWC2::Display + // is much longer lived. + auto display = std::make_unique<HWC2Display>(*composer, *mCapabilities, mHwcDisplayId, mHwcDisplayType); auto config = HWC2::Display::Config::Builder(*display, mActiveConfig); @@ -247,7 +254,7 @@ public: int32_t mDpiX = DEFAULT_DPI; int32_t mDpiY = DEFAULT_DPI; int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG; - std::unordered_set<HWC2::Capability> mCapabilities; + const std::unordered_set<HWC2::Capability>* mCapabilities = nullptr; }; class FakeDisplayDeviceInjector { |