goto done;
}
+ /* Prevent excessive memory consumption, as well as integer
+ * overflows.
+ */
+ if (xmap->menu_count == 0 ||
+ xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) {
+ ret = -EINVAL;
+ goto done;
+ }
+
size = xmap->menu_count * sizeof(*map->menu_info);
map->menu_info = kmalloc(size, GFP_KERNEL);
if (map->menu_info == NULL) {
struct uvc_frame *frame;
int ret;
- if (fmt->type != stream->type)
+ if (fmt->type != stream->type) {
+ printk("uvc_v4l2_set_format, fmt->type(%d) != stream->type(%d)\n",fmt->type,stream->type);
return -EINVAL;
+ }
ret = uvc_v4l2_try_format(stream, fmt, &probe, &format, &frame);
if (ret < 0)
mutex_lock(&stream->mutex);
if (uvc_queue_allocated(&stream->queue)) {
+ printk("uvc_queue_allocated failed\n");
ret = -EBUSY;
goto done;
}
break;
}
pin = iterm->id;
- } else if (pin < selector->bNrInPins) {
+ } else if (index < selector->bNrInPins) {
pin = selector->baSourceID[index];
list_for_each_entry(iterm, &chain->entities, chain) {
if (!UVC_ENTITY_IS_ITERM(iterm))
}
case VIDIOC_S_FMT:
- if ((ret = uvc_acquire_privileges(handle)) < 0)
+ if ((ret = uvc_acquire_privileges(handle)) < 0) {
+ printk("uvc_acquire_privileges error.");
return ret;
+ }
return uvc_v4l2_set_format(stream, arg);
}
case VIDIOC_QBUF:
- if (!uvc_has_privileges(handle))
+ if (!uvc_has_privileges(handle)) {
+ printk("uvcvideo: VIDIOC_QBUF uvc_has_privileges failed\n");
return -EBUSY;
+ }
return uvc_queue_buffer(&stream->queue, arg);
case VIDIOC_DQBUF:
- if (!uvc_has_privileges(handle))
+ if (!uvc_has_privileges(handle)) {
+ printk("uvcvideo: VIDIOC_DQBUF uvc_has_privileges failed\n");
return -EBUSY;
+ }
return uvc_dequeue_buffer(&stream->queue, arg,
file->f_flags & O_NONBLOCK);