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.
This commit is contained in:
Tom Englund
2025-03-15 19:57:52 +01:00
committed by GitHub
parent 4c471218c9
commit bf5e4bf116

View File

@@ -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;
}