Commit a6eef67c authored by Lee Jones's avatar Lee Jones Committed by Greg Kroah-Hartman
Browse files

usb: host: max3421-hcd: Replace snprintf() with the safer scnprintf() variant

There is a general misunderstanding amongst engineers that {v}snprintf()
returns the length of the data *actually* encoded into the destination
array.  However, as per the C99 standard {v}snprintf() really returns
the length of the data that *would have been* written if there were
enough space for it.  This misunderstanding has led to buffer-overruns
in the past.  It's generally considered safer to use the {v}scnprintf()
variants in their place (or even sprintf() in simple cases).  So let's
do that.

Link: https://lwn.net/Articles/69419/
Link: https://github.com/KSPP/linux/issues/105


Cc: Cristian Birsan <cristian.birsan@microchip.com>
Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Claudiu Beznea <claudiu.beznea@tuxon.dev>
Cc:  <linux-arm-kernel@lists.infradead.org>
Signed-off-by: default avatarLee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20231213164246.1021885-8-lee@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 01dc7f7c
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -1158,12 +1158,12 @@ dump_eps(struct usb_hcd *hcd)
		end = dp + sizeof(ubuf);
		*dp = '\0';
		list_for_each_entry(urb, &ep->urb_list, urb_list) {
			ret = snprintf(dp, end - dp, " %p(%d.%s %d/%d)", urb,
			ret = scnprintf(dp, end - dp, " %p(%d.%s %d/%d)", urb,
					usb_pipetype(urb->pipe),
					usb_urb_dir_in(urb) ? "IN" : "OUT",
					urb->actual_length,
					urb->transfer_buffer_length);
			if (ret < 0 || ret >= end - dp)
			if (ret == end - dp - 1)
				break;	/* error or buffer full */
			dp += ret;
		}
@@ -1255,9 +1255,9 @@ max3421_handle_irqs(struct usb_hcd *hcd)
			end = sbuf + sizeof(sbuf);
			*dp = '\0';
			for (i = 0; i < 16; ++i) {
				int ret = snprintf(dp, end - dp, " %lu",
				int ret = scnprintf(dp, end - dp, " %lu",
						    max3421_hcd->err_stat[i]);
				if (ret < 0 || ret >= end - dp)
				if (ret == end - dp - 1)
					break;	/* error or buffer full */
				dp += ret;
			}