[PATCH] usb: gadget: fotg210-udc: Fix memory leak of fotg210->ep[i]

2018-08-07 Thread Anton Vasilyev
There is no deallocation of fotg210->ep[i] elements, allocated at
fotg210_udc_probe.

The patch adds deallocation of fotg210->ep array elements and simplifies
error path of fotg210_udc_probe().

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Anton Vasilyev 
---
 drivers/usb/gadget/udc/fotg210-udc.c | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c 
b/drivers/usb/gadget/udc/fotg210-udc.c
index 53a48f561458..587c5037ff07 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -1063,12 +1063,15 @@ static const struct usb_gadget_ops fotg210_gadget_ops = 
{
 static int fotg210_udc_remove(struct platform_device *pdev)
 {
struct fotg210_udc *fotg210 = platform_get_drvdata(pdev);
+   int i;
 
usb_del_gadget_udc(>gadget);
iounmap(fotg210->reg);
free_irq(platform_get_irq(pdev, 0), fotg210);
 
fotg210_ep_free_request(>ep[0]->ep, fotg210->ep0_req);
+   for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
+   kfree(fotg210->ep[i]);
kfree(fotg210);
 
return 0;
@@ -1099,7 +1102,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
/* initialize udc */
fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL);
if (fotg210 == NULL)
-   goto err_alloc;
+   goto err;
 
for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
_ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL);
@@ -,7 +1114,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
fotg210->reg = ioremap(res->start, resource_size(res));
if (fotg210->reg == NULL) {
pr_err("ioremap error.\n");
-   goto err_map;
+   goto err_alloc;
}
 
spin_lock_init(>lock);
@@ -1159,7 +1162,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
fotg210->ep0_req = fotg210_ep_alloc_request(>ep[0]->ep,
GFP_KERNEL);
if (fotg210->ep0_req == NULL)
-   goto err_req;
+   goto err_map;
 
fotg210_init(fotg210);
 
@@ -1187,12 +1190,14 @@ static int fotg210_udc_probe(struct platform_device 
*pdev)
fotg210_ep_free_request(>ep[0]->ep, fotg210->ep0_req);
 
 err_map:
-   if (fotg210->reg)
-   iounmap(fotg210->reg);
+   iounmap(fotg210->reg);
 
 err_alloc:
+   for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
+   kfree(fotg210->ep[i]);
kfree(fotg210);
 
+err:
return ret;
 }
 
-- 
2.18.0



[PATCH] usb: gadget: fotg210-udc: Fix memory leak of fotg210->ep[i]

2018-08-07 Thread Anton Vasilyev
There is no deallocation of fotg210->ep[i] elements, allocated at
fotg210_udc_probe.

The patch adds deallocation of fotg210->ep array elements and simplifies
error path of fotg210_udc_probe().

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Anton Vasilyev 
---
 drivers/usb/gadget/udc/fotg210-udc.c | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c 
b/drivers/usb/gadget/udc/fotg210-udc.c
index 53a48f561458..587c5037ff07 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -1063,12 +1063,15 @@ static const struct usb_gadget_ops fotg210_gadget_ops = 
{
 static int fotg210_udc_remove(struct platform_device *pdev)
 {
struct fotg210_udc *fotg210 = platform_get_drvdata(pdev);
+   int i;
 
usb_del_gadget_udc(>gadget);
iounmap(fotg210->reg);
free_irq(platform_get_irq(pdev, 0), fotg210);
 
fotg210_ep_free_request(>ep[0]->ep, fotg210->ep0_req);
+   for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
+   kfree(fotg210->ep[i]);
kfree(fotg210);
 
return 0;
@@ -1099,7 +1102,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
/* initialize udc */
fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL);
if (fotg210 == NULL)
-   goto err_alloc;
+   goto err;
 
for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
_ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL);
@@ -,7 +1114,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
fotg210->reg = ioremap(res->start, resource_size(res));
if (fotg210->reg == NULL) {
pr_err("ioremap error.\n");
-   goto err_map;
+   goto err_alloc;
}
 
spin_lock_init(>lock);
@@ -1159,7 +1162,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
fotg210->ep0_req = fotg210_ep_alloc_request(>ep[0]->ep,
GFP_KERNEL);
if (fotg210->ep0_req == NULL)
-   goto err_req;
+   goto err_map;
 
fotg210_init(fotg210);
 
@@ -1187,12 +1190,14 @@ static int fotg210_udc_probe(struct platform_device 
*pdev)
fotg210_ep_free_request(>ep[0]->ep, fotg210->ep0_req);
 
 err_map:
-   if (fotg210->reg)
-   iounmap(fotg210->reg);
+   iounmap(fotg210->reg);
 
 err_alloc:
+   for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
+   kfree(fotg210->ep[i]);
kfree(fotg210);
 
+err:
return ret;
 }
 
-- 
2.18.0