summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHemant Kumar <hemantk@codeaurora.org>2018-09-19 11:34:48 -0700
committerAjay Agarwal <ajaya@codeaurora.org>2019-01-09 10:17:01 +0530
commit250bb0182b12f78a299c28873baba0a0828c0a29 (patch)
tree96457a789f9839ad08a58f4d33ebc4a644c817f3
parent7490518aee15e8d19a30010e91c8fd5d82926a14 (diff)
usb: gadget: u_audio: Check return value from config_ep_by_speed()
In case config_ep_by_speed() returns error, endpoint descriptors would not get populated. This results into NULL pointer dereference when ep desc is accessed later. Fix this by bailing out set_alt if config_ep_by_speed() API returns error. Change-Id: I581d5e9fa7f3610e96e2e3705ab7e095a93a2a59 Signed-off-by: Hemant Kumar <hemantk@codeaurora.org> Signed-off-by: Ajay Agarwal <ajaya@codeaurora.org>
-rw-r--r--drivers/usb/gadget/function/u_audio.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index d3a639297e06..435f0614d572 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -380,11 +380,14 @@ int u_audio_start_capture(struct g_audio *audio_dev)
struct usb_ep *ep;
struct uac_rtd_params *prm;
struct uac_params *params = &audio_dev->params;
- int req_len, i;
+ int req_len, i, ret;
ep = audio_dev->out_ep;
prm = &uac->c_prm;
- config_ep_by_speed(gadget, &audio_dev->func, ep);
+ ret = config_ep_by_speed(gadget, &audio_dev->func, ep);
+ if (ret)
+ return ret;
+
req_len = prm->max_psize;
prm->ep_enabled = true;
@@ -433,11 +436,13 @@ int u_audio_start_playback(struct g_audio *audio_dev)
struct uac_params *params = &audio_dev->params;
unsigned int factor, rate;
const struct usb_endpoint_descriptor *ep_desc;
- int req_len, i;
+ int req_len, i, ret;
ep = audio_dev->in_ep;
prm = &uac->p_prm;
- config_ep_by_speed(gadget, &audio_dev->func, ep);
+ ret = config_ep_by_speed(gadget, &audio_dev->func, ep);
+ if (ret)
+ return ret;
ep_desc = ep->desc;