Skip to content

Commit 86b20af

Browse files
lag-linarogregkh
authored andcommitted
usb: yurex: 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. Whilst we're at it, let's define some magic numbers to increase readability and ease of maintenance. Link: https://lwn.net/Articles/69419/ Link: KSPP/linux#105 Cc: Tomoki Sekiyama <[email protected]> Signed-off-by: Lee Jones <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent a6eef67 commit 86b20af

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

drivers/usb/misc/yurex.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
#define YUREX_BUF_SIZE 8
3535
#define YUREX_WRITE_TIMEOUT (HZ*2)
3636

37+
#define MAX_S64_STRLEN 20 /* {-}922337203685477580{7,8} */
38+
3739
/* table of devices that work with this driver */
3840
static struct usb_device_id yurex_table[] = {
3941
{ USB_DEVICE(YUREX_VENDOR_ID, YUREX_PRODUCT_ID) },
@@ -401,7 +403,7 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
401403
{
402404
struct usb_yurex *dev;
403405
int len = 0;
404-
char in_buffer[20];
406+
char in_buffer[MAX_S64_STRLEN];
405407
unsigned long flags;
406408

407409
dev = file->private_data;
@@ -412,14 +414,14 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
412414
return -ENODEV;
413415
}
414416

417+
if (WARN_ON_ONCE(dev->bbu > S64_MAX || dev->bbu < S64_MIN))
418+
return -EIO;
419+
415420
spin_lock_irqsave(&dev->lock, flags);
416-
len = snprintf(in_buffer, 20, "%lld\n", dev->bbu);
421+
scnprintf(in_buffer, MAX_S64_STRLEN, "%lld\n", dev->bbu);
417422
spin_unlock_irqrestore(&dev->lock, flags);
418423
mutex_unlock(&dev->io_mutex);
419424

420-
if (WARN_ON_ONCE(len >= sizeof(in_buffer)))
421-
return -EIO;
422-
423425
return simple_read_from_buffer(buffer, count, ppos, in_buffer, len);
424426
}
425427

0 commit comments

Comments
 (0)