Skip to content

Commit a1eda86

Browse files
kempniumiquelraynal
authored andcommitted
mtdchar: prevent integer overflow in a safety check
Commit 6420ac0 ("mtdchar: prevent unbounded allocation in MEMWRITE ioctl") added a safety check to mtdchar_write_ioctl() which attempts to ensure that the write request sent by user space does not extend beyond the MTD device's size. However, that check contains an addition of two struct mtd_write_req fields, 'start' and 'len', both of which are u64 variables. The result of that addition can overflow, allowing the safety check to be bypassed. The arguably simplest fix - changing the data types of the relevant struct mtd_write_req fields - is not feasible as it would break user space. Fix by making mtdchar_write_ioctl() truncate the value provided by user space in the 'len' field of struct mtd_write_req, so that only the lower 32 bits of that field are used, preventing the overflow. While the 'ooblen' field of struct mtd_write_req is not currently used in any similarly flawed safety check, also truncate it to 32 bits, for consistency with the 'len' field and with other MTD routines handling OOB data. Update include/uapi/mtd/mtd-abi.h accordingly. Suggested-by: Richard Weinberger <richard@nod.at> Signed-off-by: Michał Kępień <kernel@kempniu.pl> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20220516070601.11428-2-kernel@kempniu.pl
1 parent e607879 commit a1eda86

2 files changed

Lines changed: 5 additions & 2 deletions

File tree

drivers/mtd/mtdchar.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,9 @@ static int mtdchar_write_ioctl(struct mtd_info *mtd,
615615
if (!usr_oob)
616616
req.ooblen = 0;
617617

618+
req.len &= 0xffffffff;
619+
req.ooblen &= 0xffffffff;
620+
618621
if (req.start + req.len > mtd->size)
619622
return -EINVAL;
620623

include/uapi/mtd/mtd-abi.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ enum {
6969
* struct mtd_write_req - data structure for requesting a write operation
7070
*
7171
* @start: start address
72-
* @len: length of data buffer
73-
* @ooblen: length of OOB buffer
72+
* @len: length of data buffer (only lower 32 bits are used)
73+
* @ooblen: length of OOB buffer (only lower 32 bits are used)
7474
* @usr_data: user-provided data buffer
7575
* @usr_oob: user-provided OOB buffer
7676
* @mode: MTD mode (see "MTD operation modes")

0 commit comments

Comments
 (0)