1616static 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
0 commit comments