From c126c1b8d4c6b06863dd1026f9fc67c74b5a2610 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Mon, 22 Oct 2012 22:14:59 +0200 Subject: [PATCH] --- yaml --- r: 338623 b: refs/heads/master c: 391aa852a372308c216d8638e57fe8fe560558f2 h: refs/heads/master i: 338621: 48f8c076289a92baf3cfb8dd760a7cd45bf07450 338619: 215e56624d26f0852448a2ec6b5a3bbe8ff854de 338615: ac07dad198afad5681ad94d05597e9cd0f34fe08 338607: d4ea83d648e645427215b4f0ff21cb244ab2d79b 338591: 80223f2f1a92151ffefcf81e35075e1c02c4c805 338559: 4fada6be6b93779e30dd2a541210debf918e73a5 v: v3 --- [refs] | 2 +- trunk/drivers/usb/gadget/f_uac2.c | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 0f84047a9bf5..3caad12d8ed6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 64dce9144507d4a6c624fe1b8e0aa88daeae0b9b +refs/heads/master: 391aa852a372308c216d8638e57fe8fe560558f2 diff --git a/trunk/drivers/usb/gadget/f_uac2.c b/trunk/drivers/usb/gadget/f_uac2.c index d3c6cffccb72..f02b8ece5287 100644 --- a/trunk/drivers/usb/gadget/f_uac2.c +++ b/trunk/drivers/usb/gadget/f_uac2.c @@ -978,15 +978,19 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) INTF_SET(agdev->as_in_alt, ret); agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc); - if (!agdev->out_ep) + if (!agdev->out_ep) { dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); + goto err; + } agdev->out_ep->driver_data = agdev; agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc); - if (!agdev->in_ep) + if (!agdev->in_ep) { dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); + goto err; + } agdev->in_ep->driver_data = agdev; hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; @@ -1005,6 +1009,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) prm->max_psize = 0; dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); + goto err; } prm = &agdev->uac2.p_prm; @@ -1014,9 +1019,23 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) prm->max_psize = 0; dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); + goto err; } - return alsa_uac2_init(agdev); + ret = alsa_uac2_init(agdev); + if (ret) + goto err; + return 0; +err: + kfree(agdev->uac2.p_prm.rbuf); + kfree(agdev->uac2.c_prm.rbuf); + usb_free_descriptors(fn->hs_descriptors); + usb_free_descriptors(fn->descriptors); + if (agdev->in_ep) + agdev->in_ep->driver_data = NULL; + if (agdev->out_ep) + agdev->out_ep->driver_data = NULL; + return -EINVAL; } static void