Delete resources in XdgOutput teardown

Generated code typically cleans up resource objects when the client
calls the relevant destructor.

In multi-cast mode our wrapper can be deleted at any time, whilst a
client resource exists any existing resources that have a pending
message will then crash the compositor.

Deleting resources ahead of time also resolves this. calls to this
resource will no-op. The zxdg_output_v1::destroy_func will then be
called to delete the Resource object.
This commit is contained in:
David Edmundson 2020-08-24 17:48:58 +01:00
parent 9b4e2dbdf8
commit bef0f305cf

View file

@ -107,7 +107,19 @@ XdgOutputV1Interface::XdgOutputV1Interface(QObject *parent)
}
XdgOutputV1Interface::~XdgOutputV1Interface()
{}
{
// Generated code typically cleans up resource objects when the client calls the relevant destructor
// In multi-cast mode our wrapper can be deleted at any time whilst a client resource exists.
// any existing resources that have a pending message will then crash the compositor.
// Deleting resources ahead of time also resolves this. calls to this resource will no-op
const QMultiMap<struct ::wl_client*, QtWaylandServer::zxdg_output_v1::Resource*> resourceMap = d->resourceMap();
for (auto resource : resourceMap)
{
wl_resource_destroy(resource->handle);
}
}
void XdgOutputV1Interface::setLogicalSize(const QSize &size)
{