]> www.infradead.org Git - users/hch/misc.git/commitdiff
mtd: inftlcore: Add error check for inftl_read_oob()
authorWentao Liang <vulab@iscas.ac.cn>
Wed, 2 Apr 2025 03:16:43 +0000 (11:16 +0800)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Mon, 7 Apr 2025 07:02:31 +0000 (09:02 +0200)
In INFTL_findwriteunit(), the return value of inftl_read_oob()
need to be checked. A proper implementation can be
found in INFTL_deleteblock(). The status will be set as
SECTOR_IGNORE to break from the while-loop correctly
if the inftl_read_oob() fails.

Fixes: 8593fbc68b0d ("[MTD] Rework the out of band handling completely")
Cc: stable@vger.kernel.org # v2.6+
Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/inftlcore.c

index 9739387cff8c9170ba3ed3ce1e12d9ce6dfd76e7..58c6e1743f5c65b94be64ae880562546a46a1497 100644 (file)
@@ -482,10 +482,11 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block)
                silly = MAX_LOOPS;
 
                while (thisEUN <= inftl->lastEUN) {
-                       inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
-                                      blockofs, 8, &retlen, (char *)&bci);
-
-                       status = bci.Status | bci.Status1;
+                       if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
+                                      blockofs, 8, &retlen, (char *)&bci) < 0)
+                               status = SECTOR_IGNORE;
+                       else
+                               status = bci.Status | bci.Status1;
                        pr_debug("INFTL: status of block %d in EUN %d is %x\n",
                                        block , writeEUN, status);