drm: Check mode object lease status in all master ioctl paths [v4]
Attempts to modify un-leased objects are rejected with an error. Information returned about unleased objects is modified to make them appear unusable and/or disconnected. Changes for v2 as suggested by Daniel Vetter <daniel.vetter@ffwll.ch>: * With the change in the __drm_mode_object_find API to pass the file_priv along, we can now centralize most of the lease-based access checks in that function. * A few places skip that API and require in-line checks. Changes for v3 provided by Dave Airlie <airlied@redhat.com> * remove support for leasing encoders. * add support for leasing planes. Changes for v4 * Only call drm_lease_held if DRIVER_MODESET. Signed-off-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
committed by
Dave Airlie
parent
2ed077e467
commit
7de440db20
@@ -104,6 +104,25 @@ void drm_mode_object_unregister(struct drm_device *dev,
|
||||
mutex_unlock(&dev->mode_config.idr_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_lease_required - check types which must be leased to be used
|
||||
* @type: type of object
|
||||
*
|
||||
* Returns whether the provided type of drm_mode_object must
|
||||
* be owned or leased to be used by a process.
|
||||
*/
|
||||
static bool drm_lease_required(uint32_t type)
|
||||
{
|
||||
switch(type) {
|
||||
case DRM_MODE_OBJECT_CRTC:
|
||||
case DRM_MODE_OBJECT_CONNECTOR:
|
||||
case DRM_MODE_OBJECT_PLANE:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
uint32_t id, uint32_t type)
|
||||
@@ -117,6 +136,9 @@ struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev,
|
||||
if (obj && obj->id != id)
|
||||
obj = NULL;
|
||||
|
||||
if (obj && drm_lease_required(obj->type) && !_drm_lease_held(file_priv, obj->id))
|
||||
obj = NULL;
|
||||
|
||||
if (obj && obj->free_cb) {
|
||||
if (!kref_get_unless_zero(&obj->refcount))
|
||||
obj = NULL;
|
||||
|
||||
Reference in New Issue
Block a user