diff options
| author | Tom Englund <tomenglund26@gmail.com> | 2025-03-15 19:57:52 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-15 19:57:52 +0100 |
| commit | bf5e4bf11662ebedcae44cd846ba5e755d7a6ba1 (patch) | |
| tree | 42b14af0693d50e8f0d04a53c70d1ab7a0e88e67 /src/protocols/DRMSyncobj.cpp | |
| parent | 4c471218c9fd8be87f0df968004e527b4f42d948 (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.cpp | 13 |
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; } |
