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
@@ -122,10 +122,12 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
|
||||
count = 0;
|
||||
crtc_id = u64_to_user_ptr(card_res->crtc_id_ptr);
|
||||
drm_for_each_crtc(crtc, dev) {
|
||||
if (count < card_res->count_crtcs &&
|
||||
put_user(crtc->base.id, crtc_id + count))
|
||||
return -EFAULT;
|
||||
count++;
|
||||
if (drm_lease_held(file_priv, crtc->base.id)) {
|
||||
if (count < card_res->count_crtcs &&
|
||||
put_user(crtc->base.id, crtc_id + count))
|
||||
return -EFAULT;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
card_res->count_crtcs = count;
|
||||
|
||||
@@ -143,12 +145,14 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
|
||||
count = 0;
|
||||
connector_id = u64_to_user_ptr(card_res->connector_id_ptr);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
if (count < card_res->count_connectors &&
|
||||
put_user(connector->base.id, connector_id + count)) {
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
return -EFAULT;
|
||||
if (drm_lease_held(file_priv, connector->base.id)) {
|
||||
if (count < card_res->count_connectors &&
|
||||
put_user(connector->base.id, connector_id + count)) {
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
return -EFAULT;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
card_res->count_connectors = count;
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
Reference in New Issue
Block a user