From: Markus Elfring <Markus.Elfring@web.de>
To: linux-usb@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Johan Hovold <johan@kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
kernel-janitors@vger.kernel.org,
Adrian Korwel <adriank20047@gmail.com>,
Felix Gu <ustc.gu@gmail.com>
Subject: [PATCH] USB: serial: io_ti: Use common error handling code in do_download_mode()
Date: Wed, 10 Jun 2026 16:12:31 +0200 [thread overview]
Message-ID: <188a2ea8-6bb6-46aa-883d-a1472b35217f@web.de> (raw)
From: Markus Elfring <elfring@users.sourceforge.net>
Date: Wed, 10 Jun 2026 16:00:06 +0200
Use additional labels so that a bit of exception handling can be better
reused at the end of this function implementation.
This issue was detected by using the Coccinelle software.
Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
---
drivers/usb/serial/io_ti.c | 133 ++++++++++++++-----------------------
1 file changed, 51 insertions(+), 82 deletions(-)
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
index 07c0eff3bef4..a83e3dd1e5ab 100644
--- a/drivers/usb/serial/io_ti.c
+++ b/drivers/usb/serial/io_ti.c
@@ -1103,23 +1103,21 @@ static int do_download_mode(struct edgeport_serial *serial,
return -ENOMEM;
status = get_manuf_info(serial, (u8 *)ti_manuf_desc);
- if (status) {
- kfree(ti_manuf_desc);
- return status;
- }
+ if (status)
+ goto free_ti_manuf_desc;
/* Check version number of ION descriptor */
if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
dev_dbg(dev, "%s - Wrong CPU Rev %d (Must be 2)\n",
__func__, ti_cpu_rev(ti_manuf_desc));
- kfree(ti_manuf_desc);
- return -EINVAL;
+ status = -EINVAL;
+ goto free_ti_manuf_desc;
}
rom_desc = kmalloc_obj(*rom_desc);
if (!rom_desc) {
- kfree(ti_manuf_desc);
- return -ENOMEM;
+ status = -ENOMEM;
+ goto free_ti_manuf_desc;
}
/* Search for type 2 record (firmware record) */
@@ -1133,11 +1131,8 @@ static int do_download_mode(struct edgeport_serial *serial,
__func__);
firmware_version = kmalloc_obj(*firmware_version);
- if (!firmware_version) {
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -ENOMEM;
- }
+ if (!firmware_version)
+ goto e_nomem;
/*
* Validate version number
@@ -1147,12 +1142,8 @@ static int do_download_mode(struct edgeport_serial *serial,
sizeof(struct ti_i2c_desc),
sizeof(struct ti_i2c_firmware_rec),
(u8 *)firmware_version);
- if (status) {
- kfree(firmware_version);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return status;
- }
+ if (status)
+ goto free_firmware_version;
/*
* Check version number of download with current
@@ -1182,10 +1173,8 @@ static int do_download_mode(struct edgeport_serial *serial,
record = kmalloc(1, GFP_KERNEL);
if (!record) {
- kfree(firmware_version);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -ENOMEM;
+ status = -ENOMEM;
+ goto free_firmware_version;
}
/*
* In order to update the I2C firmware we must
@@ -1208,13 +1197,8 @@ static int do_download_mode(struct edgeport_serial *serial,
*/
status = write_rom(serial, start_address,
sizeof(*record), record);
- if (status) {
- kfree(record);
- kfree(firmware_version);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return status;
- }
+ if (status)
+ goto free_record;
/*
* verify the write -- must do this in order
@@ -1225,22 +1209,13 @@ static int do_download_mode(struct edgeport_serial *serial,
start_address,
sizeof(*record),
record);
- if (status) {
- kfree(record);
- kfree(firmware_version);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return status;
- }
+ if (status)
+ goto free_record;
if (*record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
dev_err(dev, "%s - error resetting device\n",
__func__);
- kfree(record);
- kfree(firmware_version);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -ENODEV;
+ goto e_nodev;
}
dev_dbg(dev, "%s - HARDWARE RESET\n", __func__);
@@ -1255,11 +1230,7 @@ static int do_download_mode(struct edgeport_serial *serial,
__func__, status);
/* return an error on purpose. */
- kfree(record);
- kfree(firmware_version);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -ENODEV;
+ goto e_nodev;
}
/* Same or newer fw version is already loaded */
serial->fw_version = download_cur_ver;
@@ -1276,18 +1247,13 @@ static int do_download_mode(struct edgeport_serial *serial,
u8 *vheader;
header = kmalloc(HEADER_SIZE, GFP_KERNEL);
- if (!header) {
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -ENOMEM;
- }
+ if (!header)
+ goto e_nomem;
vheader = kmalloc(HEADER_SIZE, GFP_KERNEL);
if (!vheader) {
kfree(header);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -ENOMEM;
+ goto e_nomem;
}
dev_dbg(dev, "%s - Found Type BLANK FIRMWARE (Type F2) record\n",
@@ -1305,13 +1271,8 @@ static int do_download_mode(struct edgeport_serial *serial,
* record type from 0xf2 to 0x02.
*/
status = build_i2c_fw_hdr(header, fw);
- if (status) {
- kfree(vheader);
- kfree(header);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -EINVAL;
- }
+ if (status)
+ goto e_inval;
/*
* Update I2C with type 0xf2 record with correct
@@ -1321,13 +1282,8 @@ static int do_download_mode(struct edgeport_serial *serial,
start_address,
HEADER_SIZE,
header);
- if (status) {
- kfree(vheader);
- kfree(header);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -EINVAL;
- }
+ if (status)
+ goto e_inval;
/*
* verify the write -- must do this in order for
@@ -1339,20 +1295,12 @@ static int do_download_mode(struct edgeport_serial *serial,
if (status) {
dev_dbg(dev, "%s - can't read header back\n",
__func__);
- kfree(vheader);
- kfree(header);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return status;
+ goto free_vheader;
}
if (memcmp(vheader, header, HEADER_SIZE)) {
dev_dbg(dev, "%s - write download record failed\n",
__func__);
- kfree(vheader);
- kfree(header);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return -EINVAL;
+ goto e_inval;
}
kfree(vheader);
@@ -1372,9 +1320,7 @@ static int do_download_mode(struct edgeport_serial *serial,
dev_err(dev,
"%s - UMPC_COPY_DNLD_TO_I2C failed\n",
__func__);
- kfree(rom_desc);
- kfree(ti_manuf_desc);
- return status;
+ goto free_rom_desc;
}
}
}
@@ -1383,6 +1329,29 @@ static int do_download_mode(struct edgeport_serial *serial,
kfree(rom_desc);
kfree(ti_manuf_desc);
return 0;
+
+e_inval:
+ status = -EINVAL;
+free_vheader:
+ kfree(vheader);
+ kfree(header);
+ goto free_rom_desc;
+
+e_nomem:
+ status = -ENOMEM;
+ goto free_rom_desc;
+
+e_nodev:
+ status = -ENODEV;
+free_record:
+ kfree(record);
+free_firmware_version:
+ kfree(firmware_version);
+free_rom_desc:
+ kfree(rom_desc);
+free_ti_manuf_desc:
+ kfree(ti_manuf_desc);
+ return status;
}
static int do_boot_mode(struct edgeport_serial *serial,
--
2.54.0
next reply other threads:[~2026-06-10 14:12 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-10 14:12 Markus Elfring [this message]
2026-06-10 23:58 ` [PATCH] USB: serial: io_ti: Use common error handling code in do_download_mode() kernel test robot
2026-06-11 2:26 ` kernel test robot
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=188a2ea8-6bb6-46aa-883d-a1472b35217f@web.de \
--to=markus.elfring@web.de \
--cc=adriank20047@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=johan@kernel.org \
--cc=kernel-janitors@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=ustc.gu@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox