423-v6.1-0002-mtd-always-initialize-stats-in-struct-mtd_oob_ops.patch 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. From e97709c9d18903f5acd5fbe2985dd054da0432b1 Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= <[email protected]>
  3. Date: Wed, 29 Jun 2022 14:57:35 +0200
  4. Subject: [PATCH 2/4] mtd: always initialize 'stats' in struct mtd_oob_ops
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. As the 'stats' field in struct mtd_oob_ops is used in conditional
  9. expressions, ensure it is always zero-initialized in all such structures
  10. to prevent random stack garbage from being interpreted as a pointer.
  11. Strictly speaking, this problem currently only needs to be fixed for
  12. struct mtd_oob_ops structures subsequently passed to mtd_read_oob().
  13. However, this commit goes a step further and makes all instances of
  14. struct mtd_oob_ops in the tree zero-initialized, in hope of preventing
  15. future problems, e.g. if struct mtd_req_stats gets extended with write
  16. statistics at some point.
  17. Signed-off-by: Michał Kępień <[email protected]>
  18. Signed-off-by: Miquel Raynal <[email protected]>
  19. Link: https://lore.kernel.org/linux-mtd/[email protected]
  20. ---
  21. drivers/mtd/inftlcore.c | 6 +++---
  22. drivers/mtd/mtdswap.c | 6 +++---
  23. drivers/mtd/nand/onenand/onenand_base.c | 4 ++--
  24. drivers/mtd/nand/onenand/onenand_bbt.c | 2 +-
  25. drivers/mtd/nand/raw/nand_bbt.c | 8 ++++----
  26. drivers/mtd/nand/raw/sm_common.c | 2 +-
  27. drivers/mtd/nftlcore.c | 6 +++---
  28. drivers/mtd/sm_ftl.c | 4 ++--
  29. drivers/mtd/ssfdc.c | 2 +-
  30. drivers/mtd/tests/nandbiterrs.c | 2 +-
  31. drivers/mtd/tests/oobtest.c | 8 ++++----
  32. drivers/mtd/tests/readtest.c | 2 +-
  33. fs/jffs2/wbuf.c | 6 +++---
  34. 13 files changed, 29 insertions(+), 29 deletions(-)
  35. --- a/drivers/mtd/inftlcore.c
  36. +++ b/drivers/mtd/inftlcore.c
  37. @@ -136,7 +136,7 @@ static void inftl_remove_dev(struct mtd_
  38. int inftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len,
  39. size_t *retlen, uint8_t *buf)
  40. {
  41. - struct mtd_oob_ops ops;
  42. + struct mtd_oob_ops ops = { };
  43. int res;
  44. ops.mode = MTD_OPS_PLACE_OOB;
  45. @@ -156,7 +156,7 @@ int inftl_read_oob(struct mtd_info *mtd,
  46. int inftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len,
  47. size_t *retlen, uint8_t *buf)
  48. {
  49. - struct mtd_oob_ops ops;
  50. + struct mtd_oob_ops ops = { };
  51. int res;
  52. ops.mode = MTD_OPS_PLACE_OOB;
  53. @@ -176,7 +176,7 @@ int inftl_write_oob(struct mtd_info *mtd
  54. static int inftl_write(struct mtd_info *mtd, loff_t offs, size_t len,
  55. size_t *retlen, uint8_t *buf, uint8_t *oob)
  56. {
  57. - struct mtd_oob_ops ops;
  58. + struct mtd_oob_ops ops = { };
  59. int res;
  60. ops.mode = MTD_OPS_PLACE_OOB;
  61. --- a/drivers/mtd/mtdswap.c
  62. +++ b/drivers/mtd/mtdswap.c
  63. @@ -323,7 +323,7 @@ static int mtdswap_read_markers(struct m
  64. struct mtdswap_oobdata *data, *data2;
  65. int ret;
  66. loff_t offset;
  67. - struct mtd_oob_ops ops;
  68. + struct mtd_oob_ops ops = { };
  69. offset = mtdswap_eb_offset(d, eb);
  70. @@ -370,7 +370,7 @@ static int mtdswap_write_marker(struct m
  71. struct mtdswap_oobdata n;
  72. int ret;
  73. loff_t offset;
  74. - struct mtd_oob_ops ops;
  75. + struct mtd_oob_ops ops = { };
  76. ops.ooboffs = 0;
  77. ops.oobbuf = (uint8_t *)&n;
  78. @@ -879,7 +879,7 @@ static unsigned int mtdswap_eblk_passes(
  79. loff_t base, pos;
  80. unsigned int *p1 = (unsigned int *)d->page_buf;
  81. unsigned char *p2 = (unsigned char *)d->oob_buf;
  82. - struct mtd_oob_ops ops;
  83. + struct mtd_oob_ops ops = { };
  84. int ret;
  85. ops.mode = MTD_OPS_AUTO_OOB;
  86. --- a/drivers/mtd/nand/onenand/onenand_base.c
  87. +++ b/drivers/mtd/nand/onenand/onenand_base.c
  88. @@ -2935,7 +2935,7 @@ static int do_otp_write(struct mtd_info
  89. struct onenand_chip *this = mtd->priv;
  90. unsigned char *pbuf = buf;
  91. int ret;
  92. - struct mtd_oob_ops ops;
  93. + struct mtd_oob_ops ops = { };
  94. /* Force buffer page aligned */
  95. if (len < mtd->writesize) {
  96. @@ -2977,7 +2977,7 @@ static int do_otp_lock(struct mtd_info *
  97. size_t *retlen, u_char *buf)
  98. {
  99. struct onenand_chip *this = mtd->priv;
  100. - struct mtd_oob_ops ops;
  101. + struct mtd_oob_ops ops = { };
  102. int ret;
  103. if (FLEXONENAND(this)) {
  104. --- a/drivers/mtd/nand/onenand/onenand_bbt.c
  105. +++ b/drivers/mtd/nand/onenand/onenand_bbt.c
  106. @@ -61,7 +61,7 @@ static int create_bbt(struct mtd_info *m
  107. int startblock;
  108. loff_t from;
  109. size_t readlen, ooblen;
  110. - struct mtd_oob_ops ops;
  111. + struct mtd_oob_ops ops = { };
  112. int rgn;
  113. printk(KERN_INFO "Scanning device for bad blocks\n");
  114. --- a/drivers/mtd/nand/raw/nand_bbt.c
  115. +++ b/drivers/mtd/nand/raw/nand_bbt.c
  116. @@ -313,7 +313,7 @@ static int scan_read_oob(struct nand_chi
  117. size_t len)
  118. {
  119. struct mtd_info *mtd = nand_to_mtd(this);
  120. - struct mtd_oob_ops ops;
  121. + struct mtd_oob_ops ops = { };
  122. int res, ret = 0;
  123. ops.mode = MTD_OPS_PLACE_OOB;
  124. @@ -354,7 +354,7 @@ static int scan_write_bbt(struct nand_ch
  125. uint8_t *buf, uint8_t *oob)
  126. {
  127. struct mtd_info *mtd = nand_to_mtd(this);
  128. - struct mtd_oob_ops ops;
  129. + struct mtd_oob_ops ops = { };
  130. ops.mode = MTD_OPS_PLACE_OOB;
  131. ops.ooboffs = 0;
  132. @@ -416,7 +416,7 @@ static int scan_block_fast(struct nand_c
  133. {
  134. struct mtd_info *mtd = nand_to_mtd(this);
  135. - struct mtd_oob_ops ops;
  136. + struct mtd_oob_ops ops = { };
  137. int ret, page_offset;
  138. ops.ooblen = mtd->oobsize;
  139. @@ -756,7 +756,7 @@ static int write_bbt(struct nand_chip *t
  140. uint8_t rcode = td->reserved_block_code;
  141. size_t retlen, len = 0;
  142. loff_t to;
  143. - struct mtd_oob_ops ops;
  144. + struct mtd_oob_ops ops = { };
  145. ops.ooblen = mtd->oobsize;
  146. ops.ooboffs = 0;
  147. --- a/drivers/mtd/nand/raw/sm_common.c
  148. +++ b/drivers/mtd/nand/raw/sm_common.c
  149. @@ -99,7 +99,7 @@ static const struct mtd_ooblayout_ops oo
  150. static int sm_block_markbad(struct nand_chip *chip, loff_t ofs)
  151. {
  152. struct mtd_info *mtd = nand_to_mtd(chip);
  153. - struct mtd_oob_ops ops;
  154. + struct mtd_oob_ops ops = { };
  155. struct sm_oob oob;
  156. int ret;
  157. --- a/drivers/mtd/nftlcore.c
  158. +++ b/drivers/mtd/nftlcore.c
  159. @@ -124,7 +124,7 @@ int nftl_read_oob(struct mtd_info *mtd,
  160. size_t *retlen, uint8_t *buf)
  161. {
  162. loff_t mask = mtd->writesize - 1;
  163. - struct mtd_oob_ops ops;
  164. + struct mtd_oob_ops ops = { };
  165. int res;
  166. ops.mode = MTD_OPS_PLACE_OOB;
  167. @@ -145,7 +145,7 @@ int nftl_write_oob(struct mtd_info *mtd,
  168. size_t *retlen, uint8_t *buf)
  169. {
  170. loff_t mask = mtd->writesize - 1;
  171. - struct mtd_oob_ops ops;
  172. + struct mtd_oob_ops ops = { };
  173. int res;
  174. ops.mode = MTD_OPS_PLACE_OOB;
  175. @@ -168,7 +168,7 @@ static int nftl_write(struct mtd_info *m
  176. size_t *retlen, uint8_t *buf, uint8_t *oob)
  177. {
  178. loff_t mask = mtd->writesize - 1;
  179. - struct mtd_oob_ops ops;
  180. + struct mtd_oob_ops ops = { };
  181. int res;
  182. ops.mode = MTD_OPS_PLACE_OOB;
  183. --- a/drivers/mtd/sm_ftl.c
  184. +++ b/drivers/mtd/sm_ftl.c
  185. @@ -239,7 +239,7 @@ static int sm_read_sector(struct sm_ftl
  186. uint8_t *buffer, struct sm_oob *oob)
  187. {
  188. struct mtd_info *mtd = ftl->trans->mtd;
  189. - struct mtd_oob_ops ops;
  190. + struct mtd_oob_ops ops = { };
  191. struct sm_oob tmp_oob;
  192. int ret = -EIO;
  193. int try = 0;
  194. @@ -323,7 +323,7 @@ static int sm_write_sector(struct sm_ftl
  195. int zone, int block, int boffset,
  196. uint8_t *buffer, struct sm_oob *oob)
  197. {
  198. - struct mtd_oob_ops ops;
  199. + struct mtd_oob_ops ops = { };
  200. struct mtd_info *mtd = ftl->trans->mtd;
  201. int ret;
  202. --- a/drivers/mtd/ssfdc.c
  203. +++ b/drivers/mtd/ssfdc.c
  204. @@ -163,7 +163,7 @@ static int read_physical_sector(struct m
  205. /* Read redundancy area (wrapper to MTD_READ_OOB */
  206. static int read_raw_oob(struct mtd_info *mtd, loff_t offs, uint8_t *buf)
  207. {
  208. - struct mtd_oob_ops ops;
  209. + struct mtd_oob_ops ops = { };
  210. int ret;
  211. ops.mode = MTD_OPS_RAW;
  212. --- a/drivers/mtd/tests/nandbiterrs.c
  213. +++ b/drivers/mtd/tests/nandbiterrs.c
  214. @@ -99,7 +99,7 @@ static int write_page(int log)
  215. static int rewrite_page(int log)
  216. {
  217. int err = 0;
  218. - struct mtd_oob_ops ops;
  219. + struct mtd_oob_ops ops = { };
  220. if (log)
  221. pr_info("rewrite page\n");
  222. --- a/drivers/mtd/tests/oobtest.c
  223. +++ b/drivers/mtd/tests/oobtest.c
  224. @@ -56,7 +56,7 @@ static void do_vary_offset(void)
  225. static int write_eraseblock(int ebnum)
  226. {
  227. int i;
  228. - struct mtd_oob_ops ops;
  229. + struct mtd_oob_ops ops = { };
  230. int err = 0;
  231. loff_t addr = (loff_t)ebnum * mtd->erasesize;
  232. @@ -165,7 +165,7 @@ static size_t memffshow(loff_t addr, lof
  233. static int verify_eraseblock(int ebnum)
  234. {
  235. int i;
  236. - struct mtd_oob_ops ops;
  237. + struct mtd_oob_ops ops = { };
  238. int err = 0;
  239. loff_t addr = (loff_t)ebnum * mtd->erasesize;
  240. size_t bitflips;
  241. @@ -260,7 +260,7 @@ static int verify_eraseblock(int ebnum)
  242. static int verify_eraseblock_in_one_go(int ebnum)
  243. {
  244. - struct mtd_oob_ops ops;
  245. + struct mtd_oob_ops ops = { };
  246. int err = 0;
  247. loff_t addr = (loff_t)ebnum * mtd->erasesize;
  248. size_t len = mtd->oobavail * pgcnt;
  249. @@ -338,7 +338,7 @@ static int __init mtd_oobtest_init(void)
  250. int err = 0;
  251. unsigned int i;
  252. uint64_t tmp;
  253. - struct mtd_oob_ops ops;
  254. + struct mtd_oob_ops ops = { };
  255. loff_t addr = 0, addr0;
  256. printk(KERN_INFO "\n");
  257. --- a/drivers/mtd/tests/readtest.c
  258. +++ b/drivers/mtd/tests/readtest.c
  259. @@ -47,7 +47,7 @@ static int read_eraseblock_by_page(int e
  260. err = ret;
  261. }
  262. if (mtd->oobsize) {
  263. - struct mtd_oob_ops ops;
  264. + struct mtd_oob_ops ops = { };
  265. ops.mode = MTD_OPS_PLACE_OOB;
  266. ops.len = 0;
  267. --- a/fs/jffs2/wbuf.c
  268. +++ b/fs/jffs2/wbuf.c
  269. @@ -1035,7 +1035,7 @@ int jffs2_check_oob_empty(struct jffs2_s
  270. {
  271. int i, ret;
  272. int cmlen = min_t(int, c->oobavail, OOB_CM_SIZE);
  273. - struct mtd_oob_ops ops;
  274. + struct mtd_oob_ops ops = { };
  275. ops.mode = MTD_OPS_AUTO_OOB;
  276. ops.ooblen = NR_OOB_SCAN_PAGES * c->oobavail;
  277. @@ -1076,7 +1076,7 @@ int jffs2_check_oob_empty(struct jffs2_s
  278. int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c,
  279. struct jffs2_eraseblock *jeb)
  280. {
  281. - struct mtd_oob_ops ops;
  282. + struct mtd_oob_ops ops = { };
  283. int ret, cmlen = min_t(int, c->oobavail, OOB_CM_SIZE);
  284. ops.mode = MTD_OPS_AUTO_OOB;
  285. @@ -1101,7 +1101,7 @@ int jffs2_write_nand_cleanmarker(struct
  286. struct jffs2_eraseblock *jeb)
  287. {
  288. int ret;
  289. - struct mtd_oob_ops ops;
  290. + struct mtd_oob_ops ops = { };
  291. int cmlen = min_t(int, c->oobavail, OOB_CM_SIZE);
  292. ops.mode = MTD_OPS_AUTO_OOB;