usb: gadget: printer: add missing error handling
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Tue, 3 Mar 2015 09:52:09 +0000 (10:52 +0100)
committerFelipe Balbi <balbi@ti.com>
Tue, 10 Mar 2015 20:33:35 +0000 (15:33 -0500)
If cdev_add() in printer_bind_config() fails, care is taken to
reverse the effects of initializations completed until the fail
happens. But if printer_req_alloc() fails, it is just one of the
two lists that is cleaned up while the effects of cdev_add()
and device_create() are not reverted.

This patch changes error handling so that at least as much cleanup is done
as when a failure happens before printer_req_alloc() invocations.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/legacy/printer.c

index eb02a6b8da08aeb3c32f8d1c24ac4a03ebf2c4a2..bbcd6aa9abd1e20cdaddcea0b34c2118b24c11ec 100644 (file)
@@ -1249,31 +1249,18 @@ static int __init printer_bind_config(struct usb_configuration *c)
        dev->current_rx_bytes = 0;
        dev->current_rx_buf = NULL;
 
+       status = -ENOMEM;
        for (i = 0; i < QLEN; i++) {
                req = printer_req_alloc(dev->in_ep, USB_BUFSIZE, GFP_KERNEL);
-               if (!req) {
-                       while (!list_empty(&dev->tx_reqs)) {
-                               req = container_of(dev->tx_reqs.next,
-                                               struct usb_request, list);
-                               list_del(&req->list);
-                               printer_req_free(dev->in_ep, req);
-                       }
-                       return -ENOMEM;
-               }
+               if (!req)
+                       goto fail;
                list_add(&req->list, &dev->tx_reqs);
        }
 
        for (i = 0; i < QLEN; i++) {
                req = printer_req_alloc(dev->out_ep, USB_BUFSIZE, GFP_KERNEL);
-               if (!req) {
-                       while (!list_empty(&dev->rx_reqs)) {
-                               req = container_of(dev->rx_reqs.next,
-                                               struct usb_request, list);
-                               list_del(&req->list);
-                               printer_req_free(dev->out_ep, req);
-                       }
-                       return -ENOMEM;
-               }
+               if (!req)
+                       goto fail;
                list_add(&req->list, &dev->rx_reqs);
        }