Skip to content

Commit 76a7bfc

Browse files
crwulffgregkh
authored andcommitted
usb: gadget: u_audio: Check return codes from usb_ep_enable and config_ep_by_speed.
These functions can fail if descriptors are malformed, or missing, for the selected USB speed. Fixes: eb9fecb ("usb: gadget: f_uac2: split out audio core") Fixes: 24f779d ("usb: gadget: f_uac2/u_audio: add feedback endpoint support") Cc: [email protected] Signed-off-by: Chris Wulff <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 228a953 commit 76a7bfc

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

drivers/usb/gadget/function/u_audio.c

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -592,16 +592,25 @@ int u_audio_start_capture(struct g_audio *audio_dev)
592592
struct usb_ep *ep, *ep_fback;
593593
struct uac_rtd_params *prm;
594594
struct uac_params *params = &audio_dev->params;
595-
int req_len, i;
595+
int req_len, i, ret;
596596

597597
prm = &uac->c_prm;
598598
dev_dbg(dev, "start capture with rate %d\n", prm->srate);
599599
ep = audio_dev->out_ep;
600-
config_ep_by_speed(gadget, &audio_dev->func, ep);
600+
ret = config_ep_by_speed(gadget, &audio_dev->func, ep);
601+
if (ret < 0) {
602+
dev_err(dev, "config_ep_by_speed for out_ep failed (%d)\n", ret);
603+
return ret;
604+
}
605+
601606
req_len = ep->maxpacket;
602607

603608
prm->ep_enabled = true;
604-
usb_ep_enable(ep);
609+
ret = usb_ep_enable(ep);
610+
if (ret < 0) {
611+
dev_err(dev, "usb_ep_enable failed for out_ep (%d)\n", ret);
612+
return ret;
613+
}
605614

606615
for (i = 0; i < params->req_number; i++) {
607616
if (!prm->reqs[i]) {
@@ -629,9 +638,18 @@ int u_audio_start_capture(struct g_audio *audio_dev)
629638
return 0;
630639

631640
/* Setup feedback endpoint */
632-
config_ep_by_speed(gadget, &audio_dev->func, ep_fback);
641+
ret = config_ep_by_speed(gadget, &audio_dev->func, ep_fback);
642+
if (ret < 0) {
643+
dev_err(dev, "config_ep_by_speed in_ep_fback failed (%d)\n", ret);
644+
return ret; // TODO: Clean up out_ep
645+
}
646+
633647
prm->fb_ep_enabled = true;
634-
usb_ep_enable(ep_fback);
648+
ret = usb_ep_enable(ep_fback);
649+
if (ret < 0) {
650+
dev_err(dev, "usb_ep_enable failed for in_ep_fback (%d)\n", ret);
651+
return ret; // TODO: Clean up out_ep
652+
}
635653
req_len = ep_fback->maxpacket;
636654

637655
req_fback = usb_ep_alloc_request(ep_fback, GFP_ATOMIC);
@@ -687,13 +705,17 @@ int u_audio_start_playback(struct g_audio *audio_dev)
687705
struct uac_params *params = &audio_dev->params;
688706
unsigned int factor;
689707
const struct usb_endpoint_descriptor *ep_desc;
690-
int req_len, i;
708+
int req_len, i, ret;
691709
unsigned int p_pktsize;
692710

693711
prm = &uac->p_prm;
694712
dev_dbg(dev, "start playback with rate %d\n", prm->srate);
695713
ep = audio_dev->in_ep;
696-
config_ep_by_speed(gadget, &audio_dev->func, ep);
714+
ret = config_ep_by_speed(gadget, &audio_dev->func, ep);
715+
if (ret < 0) {
716+
dev_err(dev, "config_ep_by_speed for in_ep failed (%d)\n", ret);
717+
return ret;
718+
}
697719

698720
ep_desc = ep->desc;
699721
/*
@@ -720,7 +742,11 @@ int u_audio_start_playback(struct g_audio *audio_dev)
720742
uac->p_residue_mil = 0;
721743

722744
prm->ep_enabled = true;
723-
usb_ep_enable(ep);
745+
ret = usb_ep_enable(ep);
746+
if (ret < 0) {
747+
dev_err(dev, "usb_ep_enable failed for in_ep (%d)\n", ret);
748+
return ret;
749+
}
724750

725751
for (i = 0; i < params->req_number; i++) {
726752
if (!prm->reqs[i]) {

0 commit comments

Comments
 (0)