In current implemtation, the "data" is not kfreed in qcprobe error path. This patch moves the memory allocation a little bit latter and only allocate memory when no error is detected in previous checking. Signed-off-by: Axel Lin <axel.lin@xxxxxxxxx> --- drivers/usb/serial/qcserial.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-) diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 04bb759..d30078c 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c @@ -109,13 +109,6 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) ifnum = intf->desc.bInterfaceNumber; dbg("This Interface = %d", ifnum); - data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private), - GFP_KERNEL); - if (!data) - return -ENOMEM; - - spin_lock_init(&data->susp_lock); - switch (nintf) { case 1: /* QDL mode */ @@ -130,8 +123,10 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) usb_endpoint_is_bulk_out(&intf->endpoint[1].desc)) { dbg("QDL port found"); - if (serial->interface->num_altsetting == 1) - return 0; + if (serial->interface->num_altsetting == 1) { + retval = 0; + goto out; + } retval = usb_set_interface(serial->dev, ifnum, 1); if (retval < 0) { @@ -140,7 +135,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) retval); retval = -ENODEV; } - return retval; + goto out; } break; @@ -156,17 +151,26 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) retval); retval = -ENODEV; } - return retval; + goto out; } break; default: dev_err(&serial->dev->dev, "unknown number of interfaces: %d\n", nintf); - return -ENODEV; } - return retval; +out: + if (retval) + return retval; + + data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private), + GFP_KERNEL); + if (!data) + return -ENOMEM; + + spin_lock_init(&data->susp_lock); + return 0; } static struct usb_serial_driver qcdevice = { -- 1.5.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html