From 211353dc34b8f0fa17fc1e4d1d5f04d6fe1910e5 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 8 Jun 2024 12:03:47 +0200 Subject: core: verify surface roles on creation of objects --- src/protocols/XDGShell.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src/protocols/XDGShell.cpp') diff --git a/src/protocols/XDGShell.cpp b/src/protocols/XDGShell.cpp index 191a1124..dcbc6162 100644 --- a/src/protocols/XDGShell.cpp +++ b/src/protocols/XDGShell.cpp @@ -419,6 +419,12 @@ CXDGSurfaceResource::~CXDGSurfaceResource() { events.destroy.emit(); if (configureSource) wl_event_source_remove(configureSource); + if (surface) + surface->resetRole(); +} + +eSurfaceRole CXDGSurfaceResource::role() { + return SURFACE_ROLE_XDG_SHELL; } bool CXDGSurfaceResource::good() { @@ -646,8 +652,19 @@ CXDGWMBase::CXDGWMBase(SP resource_) : resource(resource_) { }); resource->setGetXdgSurface([this](CXdgWmBase* r, uint32_t id, wl_resource* surf) { - const auto RESOURCE = PROTO::xdgShell->m_vSurfaces.emplace_back( - makeShared(makeShared(r->client(), r->version(), id), self.lock(), CWLSurfaceResource::fromResource(surf))); + auto SURF = CWLSurfaceResource::fromResource(surf); + + if (!SURF) { + r->error(-1, "Invalid surface passed"); + return; + } + + if (SURF->role->role() != SURFACE_ROLE_UNASSIGNED) { + r->error(-1, "Surface already has a different role"); + return; + } + + const auto RESOURCE = PROTO::xdgShell->m_vSurfaces.emplace_back(makeShared(makeShared(r->client(), r->version(), id), self.lock(), SURF)); if (!RESOURCE->good()) { r->noMemory(); @@ -656,6 +673,7 @@ CXDGWMBase::CXDGWMBase(SP resource_) : resource(resource_) { } RESOURCE->self = RESOURCE; + SURF->role = RESOURCE; surfaces.emplace_back(RESOURCE); -- cgit v1.2.3