Skip to content

Commit 3bd047a

Browse files
committed
drivers/mtd: Add check for interger overflow
1 parent 3c3c5c2 commit 3bd047a

File tree

2 files changed

+92
-14
lines changed

2 files changed

+92
-14
lines changed

drivers/mtd_emulated/mtd_emulated.c

Lines changed: 90 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
static int _init(mtd_dev_t *dev)
1717
{
1818
mtd_emulated_t *mtd = (mtd_emulated_t *)dev;
19+
1920
assert(mtd);
2021

2122
if (!mtd->init_done) {
@@ -32,7 +33,14 @@ static int _read(mtd_dev_t *dev, void *dest, uint32_t addr, uint32_t count)
3233
assert(mtd);
3334
assert(dest);
3435

35-
if ((addr + count) > mtd->size) {
36+
uint32_t addr_count;
37+
38+
if (__builtin_add_overflow(addr, count, &addr_count)) {
39+
/* check for integer overflow */
40+
return -EOVERFLOW;
41+
}
42+
43+
if (addr_count > mtd->size) {
3644
/* addr + count must not exceed the size of memory */
3745
return -EOVERFLOW;
3846
}
@@ -51,11 +59,32 @@ static int _read_page(mtd_dev_t *dev, void *dest,
5159
assert(mtd);
5260
assert(dest);
5361

54-
if (((page * mtd->base.page_size) + offset + size) > mtd->size) {
62+
uint32_t page_addr;
63+
64+
if (__builtin_mul_overflow(page, mtd->base.page_size, &page_addr)) {
65+
/* check for integer overflow */
66+
return -EOVERFLOW;
67+
}
68+
69+
uint32_t offset_size;
70+
71+
if (__builtin_add_overflow(offset, size, &offset_size)) {
72+
/* check for integer overflow */
73+
return -EOVERFLOW;
74+
}
75+
76+
uint32_t page_addr_offset_size;
77+
78+
if (__builtin_add_overflow(page_addr, offset_size, &page_addr_offset_size)) {
79+
/* check for integer overflow */
80+
return -EOVERFLOW;
81+
}
82+
83+
if (page_addr_offset_size > mtd->size) {
5584
/* page addr + offset + size must not exceed the size of memory */
5685
return -EOVERFLOW;
5786
}
58-
memcpy(dest, mtd->memory + (page * mtd->base.page_size) + offset, size);
87+
memcpy(dest, mtd->memory + page_addr + offset, size);
5988

6089
return size;
6190
}
@@ -70,13 +99,37 @@ int _write_page(mtd_dev_t *dev, const void *src,
7099
assert(mtd);
71100
assert(src);
72101

73-
if (/* offset must be smaller than the page size */
74-
(offset >= mtd->base.page_size) ||
102+
if (offset >= mtd->base.page_size) {
103+
/* offset must be smaller than the page size */
104+
return -EOVERFLOW;
105+
}
106+
107+
uint32_t page_addr;
108+
109+
if (__builtin_mul_overflow(page, mtd->base.page_size, &page_addr)) {
110+
/* check for integer overflow */
111+
return -EOVERFLOW;
112+
}
113+
114+
uint32_t offset_size;
115+
116+
if (__builtin_add_overflow(offset, size, &offset_size)) {
117+
/* check for integer overflow */
118+
return -EOVERFLOW;
119+
}
120+
121+
uint32_t page_addr_offset_size;
122+
123+
if (__builtin_add_overflow(page_addr, offset_size, &page_addr_offset_size)) {
124+
/* check for integer overflow */
125+
return -EOVERFLOW;
126+
}
127+
128+
if (page_addr_offset_size > mtd->size) {
75129
/* page addr + offset + size must not exceed the size of memory */
76-
((page * mtd->base.page_size) + offset + size) > mtd->size) {
77130
return -EOVERFLOW;
78131
}
79-
memcpy(mtd->memory + (page * mtd->base.page_size) + offset, src, size);
132+
memcpy(mtd->memory + page_addr + offset, src, size);
80133

81134
return size;
82135
}
@@ -88,12 +141,25 @@ static int _erase(mtd_dev_t *dev, uint32_t addr, uint32_t count)
88141
(void)mtd;
89142
assert(mtd);
90143

91-
if (/* addr must be aligned on a sector boundary */
92-
(addr % (mtd->base.pages_per_sector * mtd->base.page_size) != 0) ||
144+
uint32_t addr_count;
145+
146+
if (__builtin_add_overflow(addr, count, &addr_count)) {
147+
/* check for integer overflow */
148+
return -EOVERFLOW;
149+
}
150+
151+
if (addr % (mtd->base.pages_per_sector * mtd->base.page_size) != 0) {
152+
/* addr must be aligned on a sector boundary */
153+
return -EOVERFLOW;
154+
}
155+
156+
if (count % (mtd->base.pages_per_sector * mtd->base.page_size) != 0) {
93157
/* count must be a multiple of a sector size. */
94-
(count % (mtd->base.pages_per_sector * mtd->base.page_size) != 0) ||
158+
return -EOVERFLOW;
159+
}
160+
161+
if (addr_count > mtd->size) {
95162
/* addr + count must not exceed the size of memory */
96-
((addr + count) > mtd->size)) {
97163
return -EOVERFLOW;
98164
}
99165

@@ -109,10 +175,20 @@ static int _erase_sector(mtd_dev_t *dev, uint32_t sector, uint32_t num)
109175
(void)mtd;
110176
assert(mtd);
111177

112-
if (/* sector must not exceed the number of sectors */
113-
(sector >= mtd->base.sector_count) ||
178+
uint32_t sector_num;
179+
180+
if (__builtin_add_overflow(sector, num, &sector_num)) {
181+
/* check for integer overflow */
182+
return -EOVERFLOW;
183+
}
184+
185+
if (sector >= mtd->base.sector_count) {
186+
/* sector must not exceed the number of sectors */
187+
return -EOVERFLOW;
188+
}
189+
190+
if (sector_num > mtd->base.sector_count) {
114191
/* sector + num must not exceed the number of sectors */
115-
((sector + num) > mtd->base.sector_count)) {
116192
return -EOVERFLOW;
117193
}
118194

tests/pkg/littlefs/Makefile.ci

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ BOARD_INSUFFICIENT_MEMORY := \
1111
nucleo-f031k6 \
1212
nucleo-f042k6 \
1313
nucleo-l011k4 \
14+
olimex-msp430-h1611 \
1415
samd10-xmini \
1516
stk3200 \
1617
stm32f030f4-demo \
18+
telosb \
1719
#

0 commit comments

Comments
 (0)