diff options
Diffstat (limited to 'kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-race-in-wp_drm_lease_v1.patch')
-rw-r--r-- | kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-race-in-wp_drm_lease_v1.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-race-in-wp_drm_lease_v1.patch b/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-race-in-wp_drm_lease_v1.patch new file mode 100644 index 000000000000..1799a711b472 --- /dev/null +++ b/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-race-in-wp_drm_lease_v1.patch @@ -0,0 +1,73 @@ +From dc09ce85f00b3a790e2817888067c3826280dd8e Mon Sep 17 00:00:00 2001 +From: Weng Xuetian <wengxt@gmail.com> +Date: Sat, 16 Apr 2022 00:01:12 -0700 +Subject: [PATCH] Fix race in wp_drm_lease_v1. + +Basically this is a well known issue in wayland for globals. If bind +comes after destroyed, it will raise a invalid global error. The common +practice is to delay the destroy of global. Similar technique is also +applied to wl_output. + +CCBUG: 452435 +(cherry picked from commit cdc9dcfb0a1f0445c46ee2cefa114329a2408555) +--- + src/server/drmleasedevice_v1_interface.cpp | 14 +++++--------- + src/server/drmleasedevice_v1_interface_p.h | 2 +- + 2 files changed, 6 insertions(+), 10 deletions(-) + +diff --git a/src/server/drmleasedevice_v1_interface.cpp b/src/server/drmleasedevice_v1_interface.cpp +index bffd22cd..7e338022 100644 +--- a/src/server/drmleasedevice_v1_interface.cpp ++++ b/src/server/drmleasedevice_v1_interface.cpp +@@ -84,10 +84,6 @@ void DrmLeaseDeviceV1InterfacePrivate::remove() + request->connectors.clear(); + } + globalRemove(); +- removed = true; +- if (resourceMap().isEmpty()) { +- delete this; +- } + } + + void DrmLeaseDeviceV1InterfacePrivate::registerConnector(DrmLeaseConnectorV1Interface *connector) +@@ -144,6 +140,9 @@ void DrmLeaseDeviceV1InterfacePrivate::wp_drm_lease_device_v1_release(Resource * + + void DrmLeaseDeviceV1InterfacePrivate::wp_drm_lease_device_v1_bind_resource(Resource *resource) + { ++ if (isGlobalRemoved()) { ++ return; ++ } + if (!hasDrmMaster) { + pendingFds << resource->handle; + return; +@@ -161,12 +160,9 @@ void DrmLeaseDeviceV1InterfacePrivate::wp_drm_lease_device_v1_bind_resource(Reso + } + } + +-void DrmLeaseDeviceV1InterfacePrivate::wp_drm_lease_device_v1_destroy_resource(Resource *resource) ++void DrmLeaseDeviceV1InterfacePrivate::wp_drm_lease_device_v1_destroy_global() + { +- Q_UNUSED(resource) +- if (removed && resourceMap().isEmpty()) { +- delete this; +- } ++ delete this; + } + + +diff --git a/src/server/drmleasedevice_v1_interface_p.h b/src/server/drmleasedevice_v1_interface_p.h +index 4bef36e4..085aac85 100644 +--- a/src/server/drmleasedevice_v1_interface_p.h ++++ b/src/server/drmleasedevice_v1_interface_p.h +@@ -44,7 +44,7 @@ protected: + void wp_drm_lease_device_v1_create_lease_request(Resource *resource, uint32_t id) override; + void wp_drm_lease_device_v1_release(Resource *resource) override; + void wp_drm_lease_device_v1_bind_resource(Resource *resource) override; +- void wp_drm_lease_device_v1_destroy_resource(Resource *resource) override; ++ void wp_drm_lease_device_v1_destroy_global() override; + }; + + class DrmLeaseConnectorV1InterfacePrivate : public QObject, public QtWaylandServer::wp_drm_lease_connector_v1 +-- +GitLab + |