* [U-Boot] [PATCH] gadget: f_thor: Fix memory leaks of usb request and its buffer
[not found] <CGME20180523072552epcas1p3b1bdbc7e0f49053fe3ce15117e61b429@epcas1p3.samsung.com>
@ 2018-05-23 7:25 ` Seung-Woo Kim
[not found] ` <CGME20180524022820epcas1p402b05c309d490f784e0974a04559e371@epcas1p4.samsung.com>
0 siblings, 1 reply; 5+ messages in thread
From: Seung-Woo Kim @ 2018-05-23 7:25 UTC (permalink / raw)
To: u-boot
There are memory leaks of usb request and its buffer for ep0,
in_ep, and out ep. Fix memory leaks of usb request and its buffer.
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
---
drivers/usb/gadget/f_thor.c | 34 +++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c
index c8eda05..ec8bd50 100644
--- a/drivers/usb/gadget/f_thor.c
+++ b/drivers/usb/gadget/f_thor.c
@@ -752,6 +752,13 @@ int thor_handle(void)
return 0;
}
+static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
+{
+ if (req->buf)
+ free(req->buf);
+ usb_ep_free_request(ep, req);
+}
+
static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_gadget *gadget = c->cdev->gadget;
@@ -860,21 +867,18 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
return 0;
fail:
+ if (dev->req)
+ free_ep_req(gadget->ep0, dev->req);
free(dev);
return status;
}
-static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
-{
- free(req->buf);
- usb_ep_free_request(ep, req);
-}
-
static void thor_unbind(struct usb_configuration *c, struct usb_function *f)
{
struct f_thor *f_thor = func_to_thor(f);
struct thor_dev *dev = f_thor->dev;
+ free_ep_req(dev->gadget->ep0, dev->req);
free(dev);
memset(thor_func, 0, sizeof(*thor_func));
thor_func = NULL;
@@ -895,9 +899,9 @@ static void thor_func_disable(struct usb_function *f)
}
if (dev->out_ep->driver_data) {
- free(dev->out_req->buf);
+ /* buf of out_req is set with thor_set_dma(), so just clear */
dev->out_req->buf = NULL;
- usb_ep_free_request(dev->out_ep, dev->out_req);
+ free_ep_req(dev->out_ep, dev->out_req);
usb_ep_disable(dev->out_ep);
dev->out_ep->driver_data = NULL;
}
@@ -940,17 +944,29 @@ static int thor_eps_setup(struct usb_function *f)
debug("(d)bEndpointAddress: 0x%x\n", d->bEndpointAddress);
result = usb_ep_enable(ep, d);
- if (result)
+ if (result) {
+ free_ep_req(dev->in_ep, dev->in_req);
+ dev->in_req = NULL;
+ usb_ep_disable(dev->in_ep);
goto exit;
+ }
ep->driver_data = cdev; /* claim */
req = thor_start_ep(ep);
if (!req) {
usb_ep_disable(ep);
+ free_ep_req(dev->in_ep, dev->in_req);
+ dev->in_req = NULL;
+ usb_ep_disable(dev->in_ep);
result = -EIO;
goto exit;
}
+ /* buf of out_req will be set with thor_set_dma(), so clear it */
+ free(req->buf);
+ req->buf = NULL;
+ req->length = 0;
+
dev->out_req = req;
/* ACM control EP */
ep = dev->int_ep;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH v2] gadget: f_thor: Fix memory leaks of usb request and its buffer
[not found] ` <CGME20180524022820epcas1p402b05c309d490f784e0974a04559e371@epcas1p4.samsung.com>
@ 2018-05-24 2:28 ` Seung-Woo Kim
2018-05-24 22:52 ` Lukasz Majewski
[not found] ` <CGME20180525052101epcas1p2341a7ffbc074a81a1660af9d637d567f@epcas1p2.samsung.com>
0 siblings, 2 replies; 5+ messages in thread
From: Seung-Woo Kim @ 2018-05-24 2:28 UTC (permalink / raw)
To: u-boot
There are memory leaks of usb request and its buffer for ep0,
in_ep, and out ep. Fix memory leaks of usb request and its buffer.
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
---
Change from v1
- remove allocation of out_ep request instead of allocating and freeing
- fix use error path instead of duplicated error handling code
---
drivers/usb/gadget/f_thor.c | 45 ++++++++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 16 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c
index c8eda05..02d6844 100644
--- a/drivers/usb/gadget/f_thor.c
+++ b/drivers/usb/gadget/f_thor.c
@@ -752,6 +752,13 @@ int thor_handle(void)
return 0;
}
+static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
+{
+ if (req->buf)
+ free(req->buf);
+ usb_ep_free_request(ep, req);
+}
+
static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_gadget *gadget = c->cdev->gadget;
@@ -860,21 +867,18 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
return 0;
fail:
+ if (dev->req)
+ free_ep_req(gadget->ep0, dev->req);
free(dev);
return status;
}
-static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
-{
- free(req->buf);
- usb_ep_free_request(ep, req);
-}
-
static void thor_unbind(struct usb_configuration *c, struct usb_function *f)
{
struct f_thor *f_thor = func_to_thor(f);
struct thor_dev *dev = f_thor->dev;
+ free_ep_req(dev->gadget->ep0, dev->req);
free(dev);
memset(thor_func, 0, sizeof(*thor_func));
thor_func = NULL;
@@ -895,8 +899,6 @@ static void thor_func_disable(struct usb_function *f)
}
if (dev->out_ep->driver_data) {
- free(dev->out_req->buf);
- dev->out_req->buf = NULL;
usb_ep_free_request(dev->out_ep, dev->out_req);
usb_ep_disable(dev->out_ep);
dev->out_ep->driver_data = NULL;
@@ -924,14 +926,13 @@ static int thor_eps_setup(struct usb_function *f)
result = usb_ep_enable(ep, d);
if (result)
- goto exit;
+ goto err;
ep->driver_data = cdev; /* claim */
req = thor_start_ep(ep);
if (!req) {
- usb_ep_disable(ep);
result = -EIO;
- goto exit;
+ goto err_disable_in_ep;
}
dev->in_req = req;
@@ -941,22 +942,34 @@ static int thor_eps_setup(struct usb_function *f)
result = usb_ep_enable(ep, d);
if (result)
- goto exit;
+ goto err_free_in_req;
ep->driver_data = cdev; /* claim */
- req = thor_start_ep(ep);
+ req = usb_ep_alloc_request(ep, 0);
if (!req) {
- usb_ep_disable(ep);
result = -EIO;
- goto exit;
+ goto err_disable_out_ep;
}
+ req->complete = thor_rx_tx_complete;
dev->out_req = req;
/* ACM control EP */
ep = dev->int_ep;
ep->driver_data = cdev; /* claim */
- exit:
+ return 0;
+
+ err_disable_out_ep:
+ usb_ep_disable(dev->out_ep);
+
+ err_free_in_req:
+ free_ep_req(dev->in_ep, dev->in_req);
+ dev->in_req = NULL;
+
+ err_disable_in_ep:
+ usb_ep_disable(dev->in_ep);
+
+ err:
return result;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH v2] gadget: f_thor: Fix memory leaks of usb request and its buffer
2018-05-24 2:28 ` [U-Boot] [PATCH v2] " Seung-Woo Kim
@ 2018-05-24 22:52 ` Lukasz Majewski
2018-05-25 2:14 ` Seung-Woo Kim
[not found] ` <CGME20180525052101epcas1p2341a7ffbc074a81a1660af9d637d567f@epcas1p2.samsung.com>
1 sibling, 1 reply; 5+ messages in thread
From: Lukasz Majewski @ 2018-05-24 22:52 UTC (permalink / raw)
To: u-boot
Hi Seung-Woo,
> There are memory leaks of usb request and its buffer for ep0,
> in_ep, and out ep. Fix memory leaks of usb request and its buffer.
>
> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> ---
> Change from v1
> - remove allocation of out_ep request instead of allocating and
> freeing
> - fix use error path instead of duplicated error handling code
> ---
> drivers/usb/gadget/f_thor.c | 45
> ++++++++++++++++++++++++++++--------------- 1 file changed, 29
> insertions(+), 16 deletions(-)
>
> diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c
> index c8eda05..02d6844 100644
> --- a/drivers/usb/gadget/f_thor.c
> +++ b/drivers/usb/gadget/f_thor.c
> @@ -752,6 +752,13 @@ int thor_handle(void)
> return 0;
> }
>
> +static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
> +{
> + if (req->buf)
> + free(req->buf);
> + usb_ep_free_request(ep, req);
> +}
> +
> static int thor_func_bind(struct usb_configuration *c, struct
> usb_function *f) {
> struct usb_gadget *gadget = c->cdev->gadget;
> @@ -860,21 +867,18 @@ static int thor_func_bind(struct
> usb_configuration *c, struct usb_function *f) return 0;
>
> fail:
> + if (dev->req)
> + free_ep_req(gadget->ep0, dev->req);
> free(dev);
> return status;
> }
>
> -static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
> -{
> - free(req->buf);
> - usb_ep_free_request(ep, req);
> -}
> -
> static void thor_unbind(struct usb_configuration *c, struct
> usb_function *f) {
> struct f_thor *f_thor = func_to_thor(f);
> struct thor_dev *dev = f_thor->dev;
>
> + free_ep_req(dev->gadget->ep0, dev->req);
Till this change - no issues.
> free(dev);
> memset(thor_func, 0, sizeof(*thor_func));
> thor_func = NULL;
> @@ -895,8 +899,6 @@ static void thor_func_disable(struct usb_function
> *f) }
>
> if (dev->out_ep->driver_data) {
> - free(dev->out_req->buf);
> - dev->out_req->buf = NULL;
I think that this setting (to NULL) was needed to be able to ctrl+C
from thor command and then run it again (as some code checks if buf is
NULL).
> usb_ep_free_request(dev->out_ep, dev->out_req);
> usb_ep_disable(dev->out_ep);
> dev->out_ep->driver_data = NULL;
> @@ -924,14 +926,13 @@ static int thor_eps_setup(struct usb_function
> *f)
> result = usb_ep_enable(ep, d);
> if (result)
> - goto exit;
> + goto err;
>
> ep->driver_data = cdev; /* claim */
> req = thor_start_ep(ep);
> if (!req) {
> - usb_ep_disable(ep);
> result = -EIO;
> - goto exit;
> + goto err_disable_in_ep;
> }
>
> dev->in_req = req;
> @@ -941,22 +942,34 @@ static int thor_eps_setup(struct usb_function
> *f)
> result = usb_ep_enable(ep, d);
> if (result)
> - goto exit;
> + goto err_free_in_req;
>
> ep->driver_data = cdev; /* claim */
> - req = thor_start_ep(ep);
> + req = usb_ep_alloc_request(ep, 0);
Is this safe to replace thor_start_ep() - which tunes the ep params -
with generic function?
( I do see the req->complete = thor_rx_tx_complete below ).
If the thor_start_ep can be replaced with generic code, then maybe we
can remove it?
> if (!req) {
> - usb_ep_disable(ep);
> result = -EIO;
> - goto exit;
> + goto err_disable_out_ep;
> }
>
> + req->complete = thor_rx_tx_complete;
> dev->out_req = req;
> /* ACM control EP */
> ep = dev->int_ep;
> ep->driver_data = cdev; /* claim */
>
> - exit:
> + return 0;
> +
> + err_disable_out_ep:
> + usb_ep_disable(dev->out_ep);
> +
> + err_free_in_req:
> + free_ep_req(dev->in_ep, dev->in_req);
> + dev->in_req = NULL;
> +
> + err_disable_in_ep:
> + usb_ep_disable(dev->in_ep);
> +
> + err:
> return result;
> }
>
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180525/618f82d7/attachment.sig>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH v2] gadget: f_thor: Fix memory leaks of usb request and its buffer
2018-05-24 22:52 ` Lukasz Majewski
@ 2018-05-25 2:14 ` Seung-Woo Kim
0 siblings, 0 replies; 5+ messages in thread
From: Seung-Woo Kim @ 2018-05-25 2:14 UTC (permalink / raw)
To: u-boot
Hello Lukasz,
On 2018년 05월 25일 07:52, Lukasz Majewski wrote:
> Hi Seung-Woo,
>
>> There are memory leaks of usb request and its buffer for ep0,
>> in_ep, and out ep. Fix memory leaks of usb request and its buffer.
>>
>> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
>> ---
>> Change from v1
>> - remove allocation of out_ep request instead of allocating and
>> freeing
>> - fix use error path instead of duplicated error handling code
>> ---
>> drivers/usb/gadget/f_thor.c | 45
>> ++++++++++++++++++++++++++++--------------- 1 file changed, 29
>> insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c
>> index c8eda05..02d6844 100644
>> --- a/drivers/usb/gadget/f_thor.c
>> +++ b/drivers/usb/gadget/f_thor.c
>> @@ -752,6 +752,13 @@ int thor_handle(void)
>> return 0;
>> }
>>
>> +static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
>> +{
>> + if (req->buf)
>> + free(req->buf);
>> + usb_ep_free_request(ep, req);
>> +}
>> +
>> static int thor_func_bind(struct usb_configuration *c, struct
>> usb_function *f) {
>> struct usb_gadget *gadget = c->cdev->gadget;
>> @@ -860,21 +867,18 @@ static int thor_func_bind(struct
>> usb_configuration *c, struct usb_function *f) return 0;
>>
>> fail:
>> + if (dev->req)
>> + free_ep_req(gadget->ep0, dev->req);
>> free(dev);
>> return status;
>> }
>>
>> -static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
>> -{
>> - free(req->buf);
>> - usb_ep_free_request(ep, req);
>> -}
>> -
>> static void thor_unbind(struct usb_configuration *c, struct
>> usb_function *f) {
>> struct f_thor *f_thor = func_to_thor(f);
>> struct thor_dev *dev = f_thor->dev;
>>
>> + free_ep_req(dev->gadget->ep0, dev->req);
>
> Till this change - no issues.
>
>> free(dev);
>> memset(thor_func, 0, sizeof(*thor_func));
>> thor_func = NULL;
>> @@ -895,8 +899,6 @@ static void thor_func_disable(struct usb_function
>> *f) }
>>
>> if (dev->out_ep->driver_data) {
>> - free(dev->out_req->buf);
>> - dev->out_req->buf = NULL;
>
> I think that this setting (to NULL) was needed to be able to ctrl+C
> from thor command and then run it again (as some code checks if buf is
> NULL).
From the comment about usb_ep_free_request(), it frees request object.
So, it looks not required. Actually, dev->out_req = NULL; is more
necessary, but in my test, ctrl-c or thor communication failure also
flow till thor_unbind() where dev is also freed.
>
>> usb_ep_free_request(dev->out_ep, dev->out_req);
>> usb_ep_disable(dev->out_ep);
>> dev->out_ep->driver_data = NULL;
>> @@ -924,14 +926,13 @@ static int thor_eps_setup(struct usb_function
>> *f)
>> result = usb_ep_enable(ep, d);
>> if (result)
>> - goto exit;
>> + goto err;
>>
>> ep->driver_data = cdev; /* claim */
>> req = thor_start_ep(ep);
>> if (!req) {
>> - usb_ep_disable(ep);
>> result = -EIO;
>> - goto exit;
>> + goto err_disable_in_ep;
>> }
>>
>> dev->in_req = req;
>> @@ -941,22 +942,34 @@ static int thor_eps_setup(struct usb_function
>> *f)
>> result = usb_ep_enable(ep, d);
>> if (result)
>> - goto exit;
>> + goto err_free_in_req;
>>
>> ep->driver_data = cdev; /* claim */
>> - req = thor_start_ep(ep);
>> + req = usb_ep_alloc_request(ep, 0);
>
> Is this safe to replace thor_start_ep() - which tunes the ep params -
> with generic function?
It is safe, because there is no tuning ep param. The function has 3
steps including usb_ep_alloc_request() and allocating buffer with
memalign() and setting complete() callback to thor_rx_tx_complete().
For out_req, buffer allocation is not required because buffer for
out_req is always set from thor_set_dma() usually with dfu_buffer before rx.
>
> ( I do see the req->complete = thor_rx_tx_complete below ).
>
> If the thor_start_ep can be replaced with generic code, then maybe we
> can remove it?
It is possible to replace in_req case. If you prefer that, I will send
v3 after replacing thor_start_ep() usage with generic functions.
Best Regards,
- Seung-Woo Kim
>
>> if (!req) {
>> - usb_ep_disable(ep);
>> result = -EIO;
>> - goto exit;
>> + goto err_disable_out_ep;
>> }
>>
>> + req->complete = thor_rx_tx_complete;
>> dev->out_req = req;
>> /* ACM control EP */
>> ep = dev->int_ep;
>> ep->driver_data = cdev; /* claim */
>>
>> - exit:
>> + return 0;
>> +
>> + err_disable_out_ep:
>> + usb_ep_disable(dev->out_ep);
>> +
>> + err_free_in_req:
>> + free_ep_req(dev->in_ep, dev->in_req);
>> + dev->in_req = NULL;
>> +
>> + err_disable_in_ep:
>> + usb_ep_disable(dev->in_ep);
>> +
>> + err:
>> return result;
>> }
>>
>
>
>
>
> Best regards,
>
> Lukasz Majewski
>
> --
>
> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
>
--
Seung-Woo Kim
Samsung Research
--
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH v3] gadget: f_thor: Fix memory leaks of usb request and its buffer
[not found] ` <CGME20180525052101epcas1p2341a7ffbc074a81a1660af9d637d567f@epcas1p2.samsung.com>
@ 2018-05-25 5:21 ` Seung-Woo Kim
0 siblings, 0 replies; 5+ messages in thread
From: Seung-Woo Kim @ 2018-05-25 5:21 UTC (permalink / raw)
To: u-boot
There are memory leaks of usb request and its buffer for ep0,
in_ep, and out ep. Fix memory leaks of usb request and its buffer.
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
---
Change from v2
- replace only once used local function, thor_start_ep(), with generic functions
as Lukasz commented
Change from v1
- remove allocation of out_ep request instead of allocating and freeing
- fix use error path instead of duplicated error handling code
---
---
drivers/usb/gadget/f_thor.c | 65 +++++++++++++++++++++----------------------
1 file changed, 32 insertions(+), 33 deletions(-)
diff --git a/drivers/usb/gadget/f_thor.c b/drivers/usb/gadget/f_thor.c
index c8eda05..1aa6be4 100644
--- a/drivers/usb/gadget/f_thor.c
+++ b/drivers/usb/gadget/f_thor.c
@@ -620,22 +620,6 @@ static void thor_rx_tx_complete(struct usb_ep *ep, struct usb_request *req)
status, req->actual, req->length);
}
-static struct usb_request *thor_start_ep(struct usb_ep *ep)
-{
- struct usb_request *req;
-
- req = alloc_ep_req(ep, THOR_PACKET_SIZE);
- debug("%s: ep:%p req:%p\n", __func__, ep, req);
-
- if (!req)
- return NULL;
-
- memset(req->buf, 0, req->length);
- req->complete = thor_rx_tx_complete;
-
- return req;
-}
-
static void thor_setup_complete(struct usb_ep *ep, struct usb_request *req)
{
if (req->status || req->actual != req->length)
@@ -752,6 +736,13 @@ int thor_handle(void)
return 0;
}
+static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
+{
+ if (req->buf)
+ free(req->buf);
+ usb_ep_free_request(ep, req);
+}
+
static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_gadget *gadget = c->cdev->gadget;
@@ -860,21 +851,18 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
return 0;
fail:
+ if (dev->req)
+ free_ep_req(gadget->ep0, dev->req);
free(dev);
return status;
}
-static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
-{
- free(req->buf);
- usb_ep_free_request(ep, req);
-}
-
static void thor_unbind(struct usb_configuration *c, struct usb_function *f)
{
struct f_thor *f_thor = func_to_thor(f);
struct thor_dev *dev = f_thor->dev;
+ free_ep_req(dev->gadget->ep0, dev->req);
free(dev);
memset(thor_func, 0, sizeof(*thor_func));
thor_func = NULL;
@@ -895,8 +883,6 @@ static void thor_func_disable(struct usb_function *f)
}
if (dev->out_ep->driver_data) {
- free(dev->out_req->buf);
- dev->out_req->buf = NULL;
usb_ep_free_request(dev->out_ep, dev->out_req);
usb_ep_disable(dev->out_ep);
dev->out_ep->driver_data = NULL;
@@ -924,16 +910,17 @@ static int thor_eps_setup(struct usb_function *f)
result = usb_ep_enable(ep, d);
if (result)
- goto exit;
+ goto err;
ep->driver_data = cdev; /* claim */
- req = thor_start_ep(ep);
+ req = alloc_ep_req(ep, THOR_PACKET_SIZE);
if (!req) {
- usb_ep_disable(ep);
result = -EIO;
- goto exit;
+ goto err_disable_in_ep;
}
+ memset(req->buf, 0, req->length);
+ req->complete = thor_rx_tx_complete;
dev->in_req = req;
ep = dev->out_ep;
d = ep_desc(gadget, &hs_out_desc, &fs_out_desc);
@@ -941,22 +928,34 @@ static int thor_eps_setup(struct usb_function *f)
result = usb_ep_enable(ep, d);
if (result)
- goto exit;
+ goto err_free_in_req;
ep->driver_data = cdev; /* claim */
- req = thor_start_ep(ep);
+ req = usb_ep_alloc_request(ep, 0);
if (!req) {
- usb_ep_disable(ep);
result = -EIO;
- goto exit;
+ goto err_disable_out_ep;
}
+ req->complete = thor_rx_tx_complete;
dev->out_req = req;
/* ACM control EP */
ep = dev->int_ep;
ep->driver_data = cdev; /* claim */
- exit:
+ return 0;
+
+ err_disable_out_ep:
+ usb_ep_disable(dev->out_ep);
+
+ err_free_in_req:
+ free_ep_req(dev->in_ep, dev->in_req);
+ dev->in_req = NULL;
+
+ err_disable_in_ep:
+ usb_ep_disable(dev->in_ep);
+
+ err:
return result;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-05-25 5:21 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CGME20180523072552epcas1p3b1bdbc7e0f49053fe3ce15117e61b429@epcas1p3.samsung.com>
2018-05-23 7:25 ` [U-Boot] [PATCH] gadget: f_thor: Fix memory leaks of usb request and its buffer Seung-Woo Kim
[not found] ` <CGME20180524022820epcas1p402b05c309d490f784e0974a04559e371@epcas1p4.samsung.com>
2018-05-24 2:28 ` [U-Boot] [PATCH v2] " Seung-Woo Kim
2018-05-24 22:52 ` Lukasz Majewski
2018-05-25 2:14 ` Seung-Woo Kim
[not found] ` <CGME20180525052101epcas1p2341a7ffbc074a81a1660af9d637d567f@epcas1p2.samsung.com>
2018-05-25 5:21 ` [U-Boot] [PATCH v3] " Seung-Woo Kim
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.