Hello Laurent Pinchart, The patch cdda479f15cd: "USB gadget: video class function driver" from May 2, 2010, leads to the following static checker warning:
drivers/usb/gadget/function/f_uvc.c:223 uvc_function_ep0_complete() error: overflow detected. memcpy() '&uvc_event->data.data' is 60 bytes. user controlled range = '0-64' drivers/usb/gadget/function/f_uvc.c 210 static void 211 uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req) 212 { 213 struct uvc_device *uvc = req->context; 214 struct v4l2_event v4l2_event; 215 struct uvc_event *uvc_event = (void *)&v4l2_event.u.data; 216 217 if (uvc->event_setup_out) { 218 uvc->event_setup_out = 0; 219 220 memset(&v4l2_event, 0, sizeof(v4l2_event)); 221 v4l2_event.type = UVC_EVENT_DATA; 222 uvc_event->data.length = req->actual; 223 memcpy(&uvc_event->data.data, req->buf, req->actual); ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ It doesn't know the real limit of req->actual, but it's saying that there is a untrusted source which can pick a value between 0-64. 224 v4l2_event_queue(uvc->vdev, &v4l2_event); 225 } 226 } The untrusted source is in dummy_queue(). drivers/usb/gadget/udc/dummy_hcd.c 648 /* implement an emulated single-request FIFO */ 649 if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && 650 list_empty(&dum->fifo_req.queue) && 651 list_empty(&ep->queue) && 652 _req->length <= FIFO_SIZE) { ^^^^^^^^^^^^^^^^^^^^^^^^^^ _req->length is untrusted for some reason. This caps it at 0-64. 653 req = &dum->fifo_req; 654 req->req = *_req; 655 req->req.buf = dum->fifo_buf; 656 memcpy(dum->fifo_buf, _req->buf, _req->length); 657 req->req.context = dum; 658 req->req.complete = fifo_complete; 659 660 list_add_tail(&req->queue, &ep->queue); 661 spin_unlock(&dum->lock); 662 _req->actual = _req->length; ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Assigned to _req->actual. 663 _req->status = 0; 664 usb_gadget_giveback_request(_ep, _req); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ And down this call tree. 665 spin_lock(&dum->lock); There is another similar issue: drivers/usb/gadget/function/f_uac1.c:367 f_audio_complete() error: overflow detected. memcpy() '&data' is 4 bytes. user controlled range = '0-64' TODO-List: USB: gadget: potential overflow in uvc_function_ep0_complete(). regards, dan carpenter -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html