From: Johan Hovold <johan@kernel.org>
To: Himadri Pandya <himadrispandya@gmail.com>
Cc: linux-usb@vger.kernel.org,
linux-kernel-mentees@lists.linuxfoundation.org, johan@kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [Linux-kernel-mentees] [PATCH 09/15] usb: serial: io_edgeport: use usb_control_msg_recv() and usb_control_msg_send()
Date: Fri, 4 Dec 2020 11:10:33 +0100 [thread overview]
Message-ID: <X8oLGdtViazqIKDX@localhost> (raw)
In-Reply-To: <20201104064703.15123-10-himadrispandya@gmail.com>
On Wed, Nov 04, 2020 at 12:16:57PM +0530, Himadri Pandya wrote:
> The new usb_control_msg_recv() and usb_control_msg_send() nicely wraps
> usb_control_msg() with proper error check. Hence use the wrappers
> instead of calling usb_control_msg() directly.
>
> Signed-off-by: Himadri Pandya <himadrispandya@gmail.com>
> ---
> drivers/usb/serial/io_edgeport.c | 73 ++++++++++++--------------------
> 1 file changed, 27 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
> index ba5d8df69518..8479d5684af7 100644
> --- a/drivers/usb/serial/io_edgeport.c
> +++ b/drivers/usb/serial/io_edgeport.c
> @@ -568,34 +568,29 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
> int result;
> struct usb_serial *serial = ep->serial;
> struct edgeport_product_info *product_info = &ep->product_info;
> - struct edge_compatibility_descriptor *epic;
> + struct edge_compatibility_descriptor epic;
> struct edge_compatibility_bits *bits;
> struct device *dev = &serial->dev->dev;
>
> ep->is_epic = 0;
>
> - epic = kmalloc(sizeof(*epic), GFP_KERNEL);
> - if (!epic)
> - return -ENOMEM;
> -
> - result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
> - USB_REQUEST_ION_GET_EPIC_DESC,
> - 0xC0, 0x00, 0x00,
> - epic, sizeof(*epic),
> - 300);
> - if (result == sizeof(*epic)) {
> + result = usb_control_msg_recv(serial->dev, 0,
> + USB_REQUEST_ION_GET_EPIC_DESC, 0xC0,
> + 0x00, 0x00, &epic, sizeof(epic), 300,
> + GFP_KERNEL);
> + if (result) {
Here's another logical error due to the test being inverted, which
results in the uninitialised stack-allocated buffer to be used for debug
printks (potentially leaking stack data) in case of errors.
> ep->is_epic = 1;
> - memcpy(&ep->epic_descriptor, epic, sizeof(*epic));
> + memcpy(&ep->epic_descriptor, &epic, sizeof(epic));
> memset(product_info, 0, sizeof(struct edgeport_product_info));
>
> - product_info->NumPorts = epic->NumPorts;
> + product_info->NumPorts = epic.NumPorts;
> product_info->ProdInfoVer = 0;
> - product_info->FirmwareMajorVersion = epic->MajorVersion;
> - product_info->FirmwareMinorVersion = epic->MinorVersion;
> - product_info->FirmwareBuildNumber = epic->BuildNumber;
> - product_info->iDownloadFile = epic->iDownloadFile;
> - product_info->EpicVer = epic->EpicVer;
> - product_info->Epic = epic->Supports;
> + product_info->FirmwareMajorVersion = epic.MajorVersion;
> + product_info->FirmwareMinorVersion = epic.MinorVersion;
> + product_info->FirmwareBuildNumber = epic.BuildNumber;
> + product_info->iDownloadFile = epic.iDownloadFile;
> + product_info->EpicVer = epic.EpicVer;
> + product_info->Epic = epic.Supports;
> product_info->ProductId = ION_DEVICE_ID_EDGEPORT_COMPATIBLE;
> dump_product_info(ep, product_info);
>
> @@ -614,16 +609,12 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
> dev_dbg(dev, " IOSPWriteLCR : %s\n", bits->IOSPWriteLCR ? "TRUE": "FALSE");
> dev_dbg(dev, " IOSPSetBaudRate : %s\n", bits->IOSPSetBaudRate ? "TRUE": "FALSE");
> dev_dbg(dev, " TrueEdgeport : %s\n", bits->TrueEdgeport ? "TRUE": "FALSE");
> -
> - result = 0;
> - } else if (result >= 0) {
> + } else {
> dev_warn(&serial->interface->dev, "short epic descriptor received: %d\n",
> result);
> result = -EIO;
...and the driver now always fails to probe with -EIO.
> }
>
> - kfree(epic);
> -
> return result;
> }
>
> @@ -2168,11 +2159,6 @@ static int rom_read(struct usb_serial *serial, __u16 extAddr,
> {
> int result;
> __u16 current_length;
> - unsigned char *transfer_buffer;
> -
> - transfer_buffer = kmalloc(64, GFP_KERNEL);
> - if (!transfer_buffer)
> - return -ENOMEM;
>
> /* need to split these reads up into 64 byte chunks */
> result = 0;
> @@ -2181,25 +2167,18 @@ static int rom_read(struct usb_serial *serial, __u16 extAddr,
> current_length = 64;
> else
> current_length = length;
> - result = usb_control_msg(serial->dev,
> - usb_rcvctrlpipe(serial->dev, 0),
> - USB_REQUEST_ION_READ_ROM,
> - 0xC0, addr, extAddr, transfer_buffer,
> - current_length, 300);
> - if (result < current_length) {
> - if (result >= 0)
> - result = -EIO;
> + result = usb_control_msg_recv(serial->dev, 0,
> + USB_REQUEST_ION_READ_ROM, 0xC0,
> + addr, extAddr, data,
> + current_length, 300, GFP_KERNEL);
> + if (result)
> break;
> - }
> - memcpy(data, transfer_buffer, current_length);
> +
> length -= current_length;
> addr += current_length;
> data += current_length;
>
> - result = 0;
> }
> -
> - kfree(transfer_buffer);
> return result;
> }
Here a single allocation of a buffer that get's used repeatedly is
replaced with one allocation per iteration. I suggest leaving this as
is.
Please just drop this patch.
Johan
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
WARNING: multiple messages have this Message-ID (diff)
From: Johan Hovold <johan@kernel.org>
To: Himadri Pandya <himadrispandya@gmail.com>
Cc: johan@kernel.org, gregkh@linuxfoundation.org,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kernel-mentees@lists.linuxfoundation.org
Subject: Re: [PATCH 09/15] usb: serial: io_edgeport: use usb_control_msg_recv() and usb_control_msg_send()
Date: Fri, 4 Dec 2020 11:10:33 +0100 [thread overview]
Message-ID: <X8oLGdtViazqIKDX@localhost> (raw)
In-Reply-To: <20201104064703.15123-10-himadrispandya@gmail.com>
On Wed, Nov 04, 2020 at 12:16:57PM +0530, Himadri Pandya wrote:
> The new usb_control_msg_recv() and usb_control_msg_send() nicely wraps
> usb_control_msg() with proper error check. Hence use the wrappers
> instead of calling usb_control_msg() directly.
>
> Signed-off-by: Himadri Pandya <himadrispandya@gmail.com>
> ---
> drivers/usb/serial/io_edgeport.c | 73 ++++++++++++--------------------
> 1 file changed, 27 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
> index ba5d8df69518..8479d5684af7 100644
> --- a/drivers/usb/serial/io_edgeport.c
> +++ b/drivers/usb/serial/io_edgeport.c
> @@ -568,34 +568,29 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
> int result;
> struct usb_serial *serial = ep->serial;
> struct edgeport_product_info *product_info = &ep->product_info;
> - struct edge_compatibility_descriptor *epic;
> + struct edge_compatibility_descriptor epic;
> struct edge_compatibility_bits *bits;
> struct device *dev = &serial->dev->dev;
>
> ep->is_epic = 0;
>
> - epic = kmalloc(sizeof(*epic), GFP_KERNEL);
> - if (!epic)
> - return -ENOMEM;
> -
> - result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
> - USB_REQUEST_ION_GET_EPIC_DESC,
> - 0xC0, 0x00, 0x00,
> - epic, sizeof(*epic),
> - 300);
> - if (result == sizeof(*epic)) {
> + result = usb_control_msg_recv(serial->dev, 0,
> + USB_REQUEST_ION_GET_EPIC_DESC, 0xC0,
> + 0x00, 0x00, &epic, sizeof(epic), 300,
> + GFP_KERNEL);
> + if (result) {
Here's another logical error due to the test being inverted, which
results in the uninitialised stack-allocated buffer to be used for debug
printks (potentially leaking stack data) in case of errors.
> ep->is_epic = 1;
> - memcpy(&ep->epic_descriptor, epic, sizeof(*epic));
> + memcpy(&ep->epic_descriptor, &epic, sizeof(epic));
> memset(product_info, 0, sizeof(struct edgeport_product_info));
>
> - product_info->NumPorts = epic->NumPorts;
> + product_info->NumPorts = epic.NumPorts;
> product_info->ProdInfoVer = 0;
> - product_info->FirmwareMajorVersion = epic->MajorVersion;
> - product_info->FirmwareMinorVersion = epic->MinorVersion;
> - product_info->FirmwareBuildNumber = epic->BuildNumber;
> - product_info->iDownloadFile = epic->iDownloadFile;
> - product_info->EpicVer = epic->EpicVer;
> - product_info->Epic = epic->Supports;
> + product_info->FirmwareMajorVersion = epic.MajorVersion;
> + product_info->FirmwareMinorVersion = epic.MinorVersion;
> + product_info->FirmwareBuildNumber = epic.BuildNumber;
> + product_info->iDownloadFile = epic.iDownloadFile;
> + product_info->EpicVer = epic.EpicVer;
> + product_info->Epic = epic.Supports;
> product_info->ProductId = ION_DEVICE_ID_EDGEPORT_COMPATIBLE;
> dump_product_info(ep, product_info);
>
> @@ -614,16 +609,12 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
> dev_dbg(dev, " IOSPWriteLCR : %s\n", bits->IOSPWriteLCR ? "TRUE": "FALSE");
> dev_dbg(dev, " IOSPSetBaudRate : %s\n", bits->IOSPSetBaudRate ? "TRUE": "FALSE");
> dev_dbg(dev, " TrueEdgeport : %s\n", bits->TrueEdgeport ? "TRUE": "FALSE");
> -
> - result = 0;
> - } else if (result >= 0) {
> + } else {
> dev_warn(&serial->interface->dev, "short epic descriptor received: %d\n",
> result);
> result = -EIO;
...and the driver now always fails to probe with -EIO.
> }
>
> - kfree(epic);
> -
> return result;
> }
>
> @@ -2168,11 +2159,6 @@ static int rom_read(struct usb_serial *serial, __u16 extAddr,
> {
> int result;
> __u16 current_length;
> - unsigned char *transfer_buffer;
> -
> - transfer_buffer = kmalloc(64, GFP_KERNEL);
> - if (!transfer_buffer)
> - return -ENOMEM;
>
> /* need to split these reads up into 64 byte chunks */
> result = 0;
> @@ -2181,25 +2167,18 @@ static int rom_read(struct usb_serial *serial, __u16 extAddr,
> current_length = 64;
> else
> current_length = length;
> - result = usb_control_msg(serial->dev,
> - usb_rcvctrlpipe(serial->dev, 0),
> - USB_REQUEST_ION_READ_ROM,
> - 0xC0, addr, extAddr, transfer_buffer,
> - current_length, 300);
> - if (result < current_length) {
> - if (result >= 0)
> - result = -EIO;
> + result = usb_control_msg_recv(serial->dev, 0,
> + USB_REQUEST_ION_READ_ROM, 0xC0,
> + addr, extAddr, data,
> + current_length, 300, GFP_KERNEL);
> + if (result)
> break;
> - }
> - memcpy(data, transfer_buffer, current_length);
> +
> length -= current_length;
> addr += current_length;
> data += current_length;
>
> - result = 0;
> }
> -
> - kfree(transfer_buffer);
> return result;
> }
Here a single allocation of a buffer that get's used repeatedly is
replaced with one allocation per iteration. I suggest leaving this as
is.
Please just drop this patch.
Johan
next prev parent reply other threads:[~2020-12-04 10:10 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-04 6:46 [Linux-kernel-mentees] [PATCH 00/15] usb: serial: avoid using usb_control_msg() directly Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 01/15] usb: serial: ark3116: use usb_control_msg_recv() and usb_control_msg_send() Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:16 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:16 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 02/15] usb: serial: belkin_sa: use usb_control_msg_send() Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:17 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:17 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 03/15] usb: serial: ch314: use usb_control_msg_recv() and usb_control_msg_send() Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:24 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:24 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 04/15] usb: serial: cp210x: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:34 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:34 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 05/15] usb: serial: cypress_m8: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:37 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:37 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 06/15] usb: serial: f81232: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:49 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:49 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 07/15] usb: serial: f81534: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 9:55 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:55 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 08/15] usb: serial: ftdi_sio: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 10:03 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:03 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 09/15] usb: serial: io_edgeport: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 10:10 ` Johan Hovold [this message]
2020-12-04 10:10 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 10/15] usb: serial: io_ti: " Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 10:12 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:12 ` Johan Hovold
2020-11-04 6:46 ` [Linux-kernel-mentees] [PATCH 11/15] usb: serial: ipaq: use usb_control_msg_send() Himadri Pandya
2020-11-04 6:46 ` Himadri Pandya
2020-12-04 10:21 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:21 ` Johan Hovold
2020-11-04 6:47 ` [Linux-kernel-mentees] [PATCH 12/15] usb: serial: ipw: " Himadri Pandya
2020-11-04 6:47 ` Himadri Pandya
2020-12-04 10:27 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:27 ` Johan Hovold
2020-11-04 6:47 ` [Linux-kernel-mentees] [PATCH 13/15] usb: serial: iuu_phoenix: " Himadri Pandya
2020-11-04 6:47 ` Himadri Pandya
2020-12-04 10:28 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:28 ` Johan Hovold
2020-11-04 6:47 ` [Linux-kernel-mentees] [PATCH 14/15] usb: serial: keyspan_pda: use usb_control_msg_recv() and usb_control_msg_send() Himadri Pandya
2020-11-04 6:47 ` Himadri Pandya
2020-12-04 10:31 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:31 ` Johan Hovold
2020-11-04 6:47 ` [Linux-kernel-mentees] [PATCH 15/15] usb: serial: kl5kusb105: " Himadri Pandya
2020-11-04 6:47 ` Himadri Pandya
2020-12-04 10:37 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 10:37 ` Johan Hovold
2020-11-06 10:43 ` [Linux-kernel-mentees] [PATCH 00/15] usb: serial: avoid using usb_control_msg() directly Greg KH
2020-11-06 10:43 ` Greg KH
2020-12-04 9:09 ` [Linux-kernel-mentees] " Johan Hovold
2020-12-04 9:09 ` Johan Hovold
2020-12-24 10:01 ` [Linux-kernel-mentees] " Himadri Pandya
2020-12-24 10:01 ` Himadri Pandya
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=X8oLGdtViazqIKDX@localhost \
--to=johan@kernel.org \
--cc=himadrispandya@gmail.com \
--cc=linux-kernel-mentees@lists.linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.