aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2014-07-21 22:07:12 -0400
committerBrian Norris <computersforpeace@gmail.com>2014-08-19 14:53:08 -0400
commit1001ff7a4f64f3f4264e69d3ed70ff428f627e01 (patch)
tree9b673e00fda7873a9958cf5d60f66a49cf2e020c
parent8c3f3f1d7941bcb25590b784f84accd7dcb44ba3 (diff)
mtd: tests: fix integer overflow issues
These multiplications are done with 32-bit arithmetic, then converted to 64-bit. We should widen the integers first to prevent overflow. This could be a problem for large (>4GB) MTD's. Detected by Coverity. Signed-off-by: Brian Norris <computersforpeace@gmail.com> Cc: Akinobu Mita <akinobu.mita@gmail.com>
-rw-r--r--drivers/mtd/tests/mtd_test.c4
-rw-r--r--drivers/mtd/tests/nandbiterrs.c2
-rw-r--r--drivers/mtd/tests/oobtest.c8
-rw-r--r--drivers/mtd/tests/pagetest.c4
-rw-r--r--drivers/mtd/tests/readtest.c2
-rw-r--r--drivers/mtd/tests/speedtest.c14
-rw-r--r--drivers/mtd/tests/subpagetest.c10
7 files changed, 22 insertions, 22 deletions
diff --git a/drivers/mtd/tests/mtd_test.c b/drivers/mtd/tests/mtd_test.c
index 111ee46a7428..34736bbcc07b 100644
--- a/drivers/mtd/tests/mtd_test.c
+++ b/drivers/mtd/tests/mtd_test.c
@@ -10,7 +10,7 @@ int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum)
10{ 10{
11 int err; 11 int err;
12 struct erase_info ei; 12 struct erase_info ei;
13 loff_t addr = ebnum * mtd->erasesize; 13 loff_t addr = (loff_t)ebnum * mtd->erasesize;
14 14
15 memset(&ei, 0, sizeof(struct erase_info)); 15 memset(&ei, 0, sizeof(struct erase_info));
16 ei.mtd = mtd; 16 ei.mtd = mtd;
@@ -33,7 +33,7 @@ int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum)
33static int is_block_bad(struct mtd_info *mtd, unsigned int ebnum) 33static int is_block_bad(struct mtd_info *mtd, unsigned int ebnum)
34{ 34{
35 int ret; 35 int ret;
36 loff_t addr = ebnum * mtd->erasesize; 36 loff_t addr = (loff_t)ebnum * mtd->erasesize;
37 37
38 ret = mtd_block_isbad(mtd, addr); 38 ret = mtd_block_isbad(mtd, addr);
39 if (ret) 39 if (ret)
diff --git a/drivers/mtd/tests/nandbiterrs.c b/drivers/mtd/tests/nandbiterrs.c
index 6f976159611f..273f7e553954 100644
--- a/drivers/mtd/tests/nandbiterrs.c
+++ b/drivers/mtd/tests/nandbiterrs.c
@@ -364,7 +364,7 @@ static int __init mtd_nandbiterrs_init(void)
364 364
365 pr_info("Device uses %d subpages of %d bytes\n", subcount, subsize); 365 pr_info("Device uses %d subpages of %d bytes\n", subcount, subsize);
366 366
367 offset = page_offset * mtd->writesize; 367 offset = (loff_t)page_offset * mtd->writesize;
368 eraseblock = mtd_div_by_eb(offset, mtd); 368 eraseblock = mtd_div_by_eb(offset, mtd);
369 369
370 pr_info("Using page=%u, offset=%llu, eraseblock=%u\n", 370 pr_info("Using page=%u, offset=%llu, eraseblock=%u\n",
diff --git a/drivers/mtd/tests/oobtest.c b/drivers/mtd/tests/oobtest.c
index f19ab1acde1f..dc4f9602b97e 100644
--- a/drivers/mtd/tests/oobtest.c
+++ b/drivers/mtd/tests/oobtest.c
@@ -120,7 +120,7 @@ static int verify_eraseblock(int ebnum)
120 int i; 120 int i;
121 struct mtd_oob_ops ops; 121 struct mtd_oob_ops ops;
122 int err = 0; 122 int err = 0;
123 loff_t addr = ebnum * mtd->erasesize; 123 loff_t addr = (loff_t)ebnum * mtd->erasesize;
124 124
125 prandom_bytes_state(&rnd_state, writebuf, use_len_max * pgcnt); 125 prandom_bytes_state(&rnd_state, writebuf, use_len_max * pgcnt);
126 for (i = 0; i < pgcnt; ++i, addr += mtd->writesize) { 126 for (i = 0; i < pgcnt; ++i, addr += mtd->writesize) {
@@ -214,7 +214,7 @@ static int verify_eraseblock_in_one_go(int ebnum)
214{ 214{
215 struct mtd_oob_ops ops; 215 struct mtd_oob_ops ops;
216 int err = 0; 216 int err = 0;
217 loff_t addr = ebnum * mtd->erasesize; 217 loff_t addr = (loff_t)ebnum * mtd->erasesize;
218 size_t len = mtd->ecclayout->oobavail * pgcnt; 218 size_t len = mtd->ecclayout->oobavail * pgcnt;
219 219
220 prandom_bytes_state(&rnd_state, writebuf, len); 220 prandom_bytes_state(&rnd_state, writebuf, len);
@@ -568,7 +568,7 @@ static int __init mtd_oobtest_init(void)
568 size_t sz = mtd->ecclayout->oobavail; 568 size_t sz = mtd->ecclayout->oobavail;
569 if (bbt[i] || bbt[i + 1]) 569 if (bbt[i] || bbt[i + 1])
570 continue; 570 continue;
571 addr = (i + 1) * mtd->erasesize - mtd->writesize; 571 addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize;
572 prandom_bytes_state(&rnd_state, writebuf, sz * cnt); 572 prandom_bytes_state(&rnd_state, writebuf, sz * cnt);
573 for (pg = 0; pg < cnt; ++pg) { 573 for (pg = 0; pg < cnt; ++pg) {
574 ops.mode = MTD_OPS_AUTO_OOB; 574 ops.mode = MTD_OPS_AUTO_OOB;
@@ -598,7 +598,7 @@ static int __init mtd_oobtest_init(void)
598 continue; 598 continue;
599 prandom_bytes_state(&rnd_state, writebuf, 599 prandom_bytes_state(&rnd_state, writebuf,
600 mtd->ecclayout->oobavail * 2); 600 mtd->ecclayout->oobavail * 2);
601 addr = (i + 1) * mtd->erasesize - mtd->writesize; 601 addr = (loff_t)(i + 1) * mtd->erasesize - mtd->writesize;
602 ops.mode = MTD_OPS_AUTO_OOB; 602 ops.mode = MTD_OPS_AUTO_OOB;
603 ops.len = 0; 603 ops.len = 0;
604 ops.retlen = 0; 604 ops.retlen = 0;
diff --git a/drivers/mtd/tests/pagetest.c b/drivers/mtd/tests/pagetest.c
index ed2d3f656fd2..88296e888e9d 100644
--- a/drivers/mtd/tests/pagetest.c
+++ b/drivers/mtd/tests/pagetest.c
@@ -52,7 +52,7 @@ static struct rnd_state rnd_state;
52 52
53static int write_eraseblock(int ebnum) 53static int write_eraseblock(int ebnum)
54{ 54{
55 loff_t addr = ebnum * mtd->erasesize; 55 loff_t addr = (loff_t)ebnum * mtd->erasesize;
56 56
57 prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize); 57 prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize);
58 cond_resched(); 58 cond_resched();
@@ -64,7 +64,7 @@ static int verify_eraseblock(int ebnum)
64 uint32_t j; 64 uint32_t j;
65 int err = 0, i; 65 int err = 0, i;
66 loff_t addr0, addrn; 66 loff_t addr0, addrn;
67 loff_t addr = ebnum * mtd->erasesize; 67 loff_t addr = (loff_t)ebnum * mtd->erasesize;
68 68
69 addr0 = 0; 69 addr0 = 0;
70 for (i = 0; i < ebcnt && bbt[i]; ++i) 70 for (i = 0; i < ebcnt && bbt[i]; ++i)
diff --git a/drivers/mtd/tests/readtest.c b/drivers/mtd/tests/readtest.c
index 626e66d0f7e7..a54cf1511114 100644
--- a/drivers/mtd/tests/readtest.c
+++ b/drivers/mtd/tests/readtest.c
@@ -47,7 +47,7 @@ static int pgcnt;
47static int read_eraseblock_by_page(int ebnum) 47static int read_eraseblock_by_page(int ebnum)
48{ 48{
49 int i, ret, err = 0; 49 int i, ret, err = 0;
50 loff_t addr = ebnum * mtd->erasesize; 50 loff_t addr = (loff_t)ebnum * mtd->erasesize;
51 void *buf = iobuf; 51 void *buf = iobuf;
52 void *oobbuf = iobuf1; 52 void *oobbuf = iobuf1;
53 53
diff --git a/drivers/mtd/tests/speedtest.c b/drivers/mtd/tests/speedtest.c
index 87ff6a29f84e..5ee9f7021020 100644
--- a/drivers/mtd/tests/speedtest.c
+++ b/drivers/mtd/tests/speedtest.c
@@ -55,7 +55,7 @@ static int multiblock_erase(int ebnum, int blocks)
55{ 55{
56 int err; 56 int err;
57 struct erase_info ei; 57 struct erase_info ei;
58 loff_t addr = ebnum * mtd->erasesize; 58 loff_t addr = (loff_t)ebnum * mtd->erasesize;
59 59
60 memset(&ei, 0, sizeof(struct erase_info)); 60 memset(&ei, 0, sizeof(struct erase_info));
61 ei.mtd = mtd; 61 ei.mtd = mtd;
@@ -80,7 +80,7 @@ static int multiblock_erase(int ebnum, int blocks)
80 80
81static int write_eraseblock(int ebnum) 81static int write_eraseblock(int ebnum)
82{ 82{
83 loff_t addr = ebnum * mtd->erasesize; 83 loff_t addr = (loff_t)ebnum * mtd->erasesize;
84 84
85 return mtdtest_write(mtd, addr, mtd->erasesize, iobuf); 85 return mtdtest_write(mtd, addr, mtd->erasesize, iobuf);
86} 86}
@@ -88,7 +88,7 @@ static int write_eraseblock(int ebnum)
88static int write_eraseblock_by_page(int ebnum) 88static int write_eraseblock_by_page(int ebnum)
89{ 89{
90 int i, err = 0; 90 int i, err = 0;
91 loff_t addr = ebnum * mtd->erasesize; 91 loff_t addr = (loff_t)ebnum * mtd->erasesize;
92 void *buf = iobuf; 92 void *buf = iobuf;
93 93
94 for (i = 0; i < pgcnt; i++) { 94 for (i = 0; i < pgcnt; i++) {
@@ -106,7 +106,7 @@ static int write_eraseblock_by_2pages(int ebnum)
106{ 106{
107 size_t sz = pgsize * 2; 107 size_t sz = pgsize * 2;
108 int i, n = pgcnt / 2, err = 0; 108 int i, n = pgcnt / 2, err = 0;
109 loff_t addr = ebnum * mtd->erasesize; 109 loff_t addr = (loff_t)ebnum * mtd->erasesize;
110 void *buf = iobuf; 110 void *buf = iobuf;
111 111
112 for (i = 0; i < n; i++) { 112 for (i = 0; i < n; i++) {
@@ -124,7 +124,7 @@ static int write_eraseblock_by_2pages(int ebnum)
124 124
125static int read_eraseblock(int ebnum) 125static int read_eraseblock(int ebnum)
126{ 126{
127 loff_t addr = ebnum * mtd->erasesize; 127 loff_t addr = (loff_t)ebnum * mtd->erasesize;
128 128
129 return mtdtest_read(mtd, addr, mtd->erasesize, iobuf); 129 return mtdtest_read(mtd, addr, mtd->erasesize, iobuf);
130} 130}
@@ -132,7 +132,7 @@ static int read_eraseblock(int ebnum)
132static int read_eraseblock_by_page(int ebnum) 132static int read_eraseblock_by_page(int ebnum)
133{ 133{
134 int i, err = 0; 134 int i, err = 0;
135 loff_t addr = ebnum * mtd->erasesize; 135 loff_t addr = (loff_t)ebnum * mtd->erasesize;
136 void *buf = iobuf; 136 void *buf = iobuf;
137 137
138 for (i = 0; i < pgcnt; i++) { 138 for (i = 0; i < pgcnt; i++) {
@@ -150,7 +150,7 @@ static int read_eraseblock_by_2pages(int ebnum)
150{ 150{
151 size_t sz = pgsize * 2; 151 size_t sz = pgsize * 2;
152 int i, n = pgcnt / 2, err = 0; 152 int i, n = pgcnt / 2, err = 0;
153 loff_t addr = ebnum * mtd->erasesize; 153 loff_t addr = (loff_t)ebnum * mtd->erasesize;
154 void *buf = iobuf; 154 void *buf = iobuf;
155 155
156 for (i = 0; i < n; i++) { 156 for (i = 0; i < n; i++) {
diff --git a/drivers/mtd/tests/subpagetest.c b/drivers/mtd/tests/subpagetest.c
index a876371ad410..7b59ef522d5e 100644
--- a/drivers/mtd/tests/subpagetest.c
+++ b/drivers/mtd/tests/subpagetest.c
@@ -57,7 +57,7 @@ static int write_eraseblock(int ebnum)
57{ 57{
58 size_t written; 58 size_t written;
59 int err = 0; 59 int err = 0;
60 loff_t addr = ebnum * mtd->erasesize; 60 loff_t addr = (loff_t)ebnum * mtd->erasesize;
61 61
62 prandom_bytes_state(&rnd_state, writebuf, subpgsize); 62 prandom_bytes_state(&rnd_state, writebuf, subpgsize);
63 err = mtd_write(mtd, addr, subpgsize, &written, writebuf); 63 err = mtd_write(mtd, addr, subpgsize, &written, writebuf);
@@ -92,7 +92,7 @@ static int write_eraseblock2(int ebnum)
92{ 92{
93 size_t written; 93 size_t written;
94 int err = 0, k; 94 int err = 0, k;
95 loff_t addr = ebnum * mtd->erasesize; 95 loff_t addr = (loff_t)ebnum * mtd->erasesize;
96 96
97 for (k = 1; k < 33; ++k) { 97 for (k = 1; k < 33; ++k) {
98 if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize) 98 if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize)
@@ -131,7 +131,7 @@ static int verify_eraseblock(int ebnum)
131{ 131{
132 size_t read; 132 size_t read;
133 int err = 0; 133 int err = 0;
134 loff_t addr = ebnum * mtd->erasesize; 134 loff_t addr = (loff_t)ebnum * mtd->erasesize;
135 135
136 prandom_bytes_state(&rnd_state, writebuf, subpgsize); 136 prandom_bytes_state(&rnd_state, writebuf, subpgsize);
137 clear_data(readbuf, subpgsize); 137 clear_data(readbuf, subpgsize);
@@ -192,7 +192,7 @@ static int verify_eraseblock2(int ebnum)
192{ 192{
193 size_t read; 193 size_t read;
194 int err = 0, k; 194 int err = 0, k;
195 loff_t addr = ebnum * mtd->erasesize; 195 loff_t addr = (loff_t)ebnum * mtd->erasesize;
196 196
197 for (k = 1; k < 33; ++k) { 197 for (k = 1; k < 33; ++k) {
198 if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize) 198 if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize)
@@ -227,7 +227,7 @@ static int verify_eraseblock_ff(int ebnum)
227 uint32_t j; 227 uint32_t j;
228 size_t read; 228 size_t read;
229 int err = 0; 229 int err = 0;
230 loff_t addr = ebnum * mtd->erasesize; 230 loff_t addr = (loff_t)ebnum * mtd->erasesize;
231 231
232 memset(writebuf, 0xff, subpgsize); 232 memset(writebuf, 0xff, subpgsize);
233 for (j = 0; j < mtd->erasesize / subpgsize; ++j) { 233 for (j = 0; j < mtd->erasesize / subpgsize; ++j) {