summaryrefslogtreecommitdiff
path: root/src/protocols/DRMSyncobj.cpp
diff options
context:
space:
mode:
authorTom Englund <tomenglund26@gmail.com>2025-03-15 19:57:52 +0100
committerGitHub <noreply@github.com>2025-03-15 19:57:52 +0100
commitbf5e4bf11662ebedcae44cd846ba5e755d7a6ba1 (patch)
tree42b14af0693d50e8f0d04a53c70d1ab7a0e88e67 /src/protocols/DRMSyncobj.cpp
parent4c471218c9fd8be87f0df968004e527b4f42d948 (diff)
syncobj: dont crash compositor on protocol errors (#9627)
dont call a member on null pointer if client misbehaves. as in the weak pointer being expired.
Diffstat (limited to 'src/protocols/DRMSyncobj.cpp')
-rw-r--r--src/protocols/DRMSyncobj.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/protocols/DRMSyncobj.cpp b/src/protocols/DRMSyncobj.cpp
index 406b55e0..21b58513 100644
--- a/src/protocols/DRMSyncobj.cpp
+++ b/src/protocols/DRMSyncobj.cpp
@@ -30,7 +30,7 @@ WP<CSyncTimeline> CDRMSyncPointState::timeline() {
}
bool CDRMSyncPointState::expired() {
- return !m_resource || !m_resource->timeline;
+ return m_resource.expired() || !m_resource->timeline;
}
UP<CSyncReleaser> CDRMSyncPointState::createSyncRelease() {
@@ -177,9 +177,14 @@ bool CDRMSyncobjSurfaceResource::protocolError() {
return true;
}
- if (!!surface->pending.buffer->acquire != !!surface->pending.buffer->release) {
- resource->error(surface->pending.buffer->acquire ? WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_RELEASE_POINT : WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_ACQUIRE_POINT,
- "Missing timeline");
+ if (!surface->pending.buffer->acquire || !surface->pending.buffer->acquire->timeline()) {
+ resource->error(WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_ACQUIRE_POINT, "Missing acquire timeline");
+ surface->pending.rejected = true;
+ return true;
+ }
+
+ if (!surface->pending.buffer->release || !surface->pending.buffer->release->timeline()) {
+ resource->error(WP_LINUX_DRM_SYNCOBJ_SURFACE_V1_ERROR_NO_RELEASE_POINT, "Missing release timeline");
surface->pending.rejected = true;
return true;
}