[media] uvcvideo: Return -ERANGE when userspace sets an unsupported menu entry
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Sat, 30 Apr 2011 12:46:11 +0000 (09:46 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 20 May 2011 12:30:45 +0000 (09:30 -0300)
Instead of passing the value down to the device and getting an error
back (or worse, crashing the firmware), return -ERANGE when the
requested menu entry is not supported.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/uvc/uvc_ctrl.c

index 0dc2a9f7ca51c6c1fb3aaf5abd950cb9dac4573f..a4db26fa2f53269993660d8eedb7569111f5d0d2 100644 (file)
@@ -1221,6 +1221,23 @@ int uvc_ctrl_set(struct uvc_video_chain *chain,
                if (xctrl->value < 0 || xctrl->value >= mapping->menu_count)
                        return -ERANGE;
                value = mapping->menu_info[xctrl->value].value;
+
+               /* Valid menu indices are reported by the GET_RES request for
+                * UVC controls that support it.
+                */
+               if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) {
+                       if (!ctrl->cached) {
+                               ret = uvc_ctrl_populate_cache(chain, ctrl);
+                               if (ret < 0)
+                                       return ret;
+                       }
+
+                       step = mapping->get(mapping, UVC_GET_RES,
+                                       uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
+                       if (!(step & value))
+                               return -ERANGE;
+               }
+
                break;
 
        default: