[server] Ensure that Resource::Private::get returns nullptr if passed a nullptr

Summary:
A Resource might be unbound, but not yet destroyed. In that case this
return a Resource instead of nullptr.

This change adds an explicit nullptr check.

Reviewers: #plasma_on_wayland

Subscribers: plasma-devel

Tags: #plasma_on_wayland

Differential Revision: https://phabricator.kde.org/D1938
This commit is contained in:
Martin Gräßlin 2016-06-17 15:54:00 +02:00
parent b612251015
commit db602b8188
2 changed files with 10 additions and 0 deletions

View file

@ -178,6 +178,8 @@ void TestWaylandSurface::testStaticAccessor()
QSignalSpy serverSurfaceCreated(m_compositorInterface, SIGNAL(surfaceCreated(KWayland::Server::SurfaceInterface*))); QSignalSpy serverSurfaceCreated(m_compositorInterface, SIGNAL(surfaceCreated(KWayland::Server::SurfaceInterface*)));
QVERIFY(serverSurfaceCreated.isValid()); QVERIFY(serverSurfaceCreated.isValid());
QVERIFY(!KWayland::Server::SurfaceInterface::get(nullptr));
QVERIFY(!KWayland::Server::SurfaceInterface::get(1, nullptr));
QVERIFY(KWayland::Client::Surface::all().isEmpty()); QVERIFY(KWayland::Client::Surface::all().isEmpty());
KWayland::Client::Surface *s1 = m_compositor->createSurface(); KWayland::Client::Surface *s1 = m_compositor->createSurface();
QVERIFY(s1->isValid()); QVERIFY(s1->isValid());
@ -226,6 +228,11 @@ void TestWaylandSurface::testStaticAccessor()
delete s1; delete s1;
QVERIFY(KWayland::Client::Surface::all().isEmpty()); QVERIFY(KWayland::Client::Surface::all().isEmpty());
QVERIFY(!KWayland::Client::Surface::get(nullptr)); QVERIFY(!KWayland::Client::Surface::get(nullptr));
QSignalSpy unboundSpy(serverSurface1, &KWayland::Server::Resource::unbound);
QVERIFY(unboundSpy.isValid());
QVERIFY(unboundSpy.wait());
QVERIFY(!KWayland::Server::SurfaceInterface::get(nullptr));
QVERIFY(!KWayland::Server::SurfaceInterface::get(1, nullptr));
} }
void TestWaylandSurface::testDamage() void TestWaylandSurface::testDamage()

View file

@ -44,6 +44,9 @@ public:
static ResourceDerived *get(wl_resource *native) { static ResourceDerived *get(wl_resource *native) {
static_assert(std::is_base_of<Resource, ResourceDerived>::value, static_assert(std::is_base_of<Resource, ResourceDerived>::value,
"ResourceDerived must be derived from Resource"); "ResourceDerived must be derived from Resource");
if (!native) {
return nullptr;
}
auto it = std::find_if(s_allResources.constBegin(), s_allResources.constEnd(), auto it = std::find_if(s_allResources.constBegin(), s_allResources.constEnd(),
[native](Private *p) { [native](Private *p) {
return p->resource == native; return p->resource == native;