Linux USB
 help / color / mirror / Atom feed
* [PATCH] USB: serial: io_ti: Use common error handling code in do_download_mode()
@ 2026-06-10 14:12 Markus Elfring
  2026-06-10 23:58 ` kernel test robot
  2026-06-11  2:26 ` kernel test robot
  0 siblings, 2 replies; 3+ messages in thread
From: Markus Elfring @ 2026-06-10 14:12 UTC (permalink / raw)
  To: linux-usb, Greg Kroah-Hartman, Johan Hovold
  Cc: LKML, kernel-janitors, Adrian Korwel, Felix Gu

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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-06-11  2:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-10 14:12 [PATCH] USB: serial: io_ti: Use common error handling code in do_download_mode() Markus Elfring
2026-06-10 23:58 ` kernel test robot
2026-06-11  2:26 ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox