kernel: guard vb2 queue before stream

This commit is contained in:
Brad Stein 2026-01-23 16:25:39 -03:00
parent ffc79982fc
commit 213673274d

View File

@ -42,10 +42,26 @@
+ video->uvc_num_requests, video->reqs_per_frame, + video->uvc_num_requests, video->reqs_per_frame,
+ video->queue.use_sg, video->queue.flags); + video->queue.use_sg, video->queue.flags);
+ +
@@ -807,6 +820,15 @@
video->is_enabled = true;
+ if (!video->queue.queue.lock || !video->queue.queue.ops ||
+ !video->queue.queue.mem_ops) {
+ uvcg_err(&video->uvc->func,
+ "Video queue not ready: dev=%p lock=%p ops=%p mem_ops=%p buf_ops=%p drv_priv=%p type=%u io_modes=0x%x\n",
+ video->queue.queue.dev, video->queue.queue.lock,
+ video->queue.queue.ops, video->queue.queue.mem_ops,
+ video->queue.queue.buf_ops, video->queue.queue.drv_priv,
+ video->queue.queue.type, video->queue.queue.io_modes);
+ return -EINVAL;
+ }
+
if ((ret = uvcg_queue_enable(&video->queue, 1)) < 0)
return ret;
/* /*
* Safe to access request related fields without req_lock because * Safe to access request related fields without req_lock because
* this is the only thread currently active, and no other * this is the only thread currently active, and no other
@@ -510,6 +532,19 @@ @@ -510,6 +532,19 @@
if (req_size > max_req_size) { if (req_size > max_req_size) {
/* The prepared interval length and expected buffer size /* The prepared interval length and expected buffer size
@ -55,7 +71,7 @@
req_size = max_req_size; req_size = max_req_size;
} }
video->req_size = req_size; video->req_size = req_size;
if (!req_size || !video->max_payload_size || !video->imagesize || !nreq) { if (!req_size || !video->max_payload_size || !video->imagesize || !nreq) {
uvcg_info(&uvc->func, uvcg_info(&uvc->func,
"Video prep requests: imagesize=%u interval=%u interval_dur=%u nreq=%u header=%u req_size=%u max_req=%u max_payload=%u ep_maxpacket=%u maxburst=%u mult=%u bInterval=%u speed=%u\n", "Video prep requests: imagesize=%u interval=%u interval_dur=%u nreq=%u header=%u req_size=%u max_req=%u max_payload=%u ep_maxpacket=%u maxburst=%u mult=%u bInterval=%u speed=%u\n",
@ -65,5 +81,5 @@
video->ep->maxburst, video->ep->mult, video->ep->maxburst, video->ep->mult,
video->ep->desc->bInterval, cdev->gadget->speed); video->ep->desc->bInterval, cdev->gadget->speed);
} }
/* We need to compensate the amount of requests to be /* We need to compensate the amount of requests to be