diff options
author | Martin Rubli <martin_rubli@logitech.com> | 2010-09-08 04:15:23 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-21 01:18:22 -0200 |
commit | 8fb91b33c6bfa3ac5e4ad76920b7bcd7bdbbb6d0 (patch) | |
tree | c7e33ca829580a6a8d8f8808c4b860cf12a2cbca /drivers/media/video/uvc/uvc_ctrl.c | |
parent | ba2fa99668bb9bf03757a020f15bba295d5c0a3e (diff) | |
download | linux-stable-8fb91b33c6bfa3ac5e4ad76920b7bcd7bdbbb6d0.tar.gz linux-stable-8fb91b33c6bfa3ac5e4ad76920b7bcd7bdbbb6d0.tar.bz2 linux-stable-8fb91b33c6bfa3ac5e4ad76920b7bcd7bdbbb6d0.zip |
[media] uvcvideo: Remove sysadmin requirements for UVCIOC_CTRL_MAP
This patch removes the sysadmin requirements for UVCIOC_CTRL_MAP (and the stub
implementation of UVCIOC_CTRL_ADD). This requirement no longer makes sense with
the new XU control access mechanisms since XU controls can be accessed without
adding control mappings first.
A maximum number (currently 1024) of control mappings per device is enforced to
avoid excess memory consumption caused by careless user space applications.
Signed-off-by: Martin Rubli <martin_rubli@logitech.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/uvc/uvc_ctrl.c')
-rw-r--r-- | drivers/media/video/uvc/uvc_ctrl.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c index 2c81b7f35551..531a3e1a6d17 100644 --- a/drivers/media/video/uvc/uvc_ctrl.c +++ b/drivers/media/video/uvc/uvc_ctrl.c @@ -1435,6 +1435,7 @@ int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, struct uvc_entity *entity; struct uvc_control *ctrl; int found = 0; + int ret; if (mapping->id & ~V4L2_CTRL_ID_MASK) { uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s', control " @@ -1478,7 +1479,20 @@ int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, } } + /* Prevent excess memory consumption */ + if (atomic_inc_return(&dev->nmappings) > UVC_MAX_CONTROL_MAPPINGS) { + atomic_dec(&dev->nmappings); + uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s', maximum " + "mappings count (%u) exceeded.\n", mapping->name, + UVC_MAX_CONTROL_MAPPINGS); + ret = -ENOMEM; + goto done; + } + ret = __uvc_ctrl_add_mapping(dev, ctrl, mapping); + if (ret < 0) + atomic_dec(&dev->nmappings); + done: mutex_unlock(&chain->ctrl_mutex); return ret; |