Linux USB
 help / color / mirror / Atom feed
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


             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