kernel: don't auto attach ubi on read error
authorMathias Kresin <[email protected]>
Sun, 8 Jul 2018 21:18:15 +0000 (23:18 +0200)
committerJo-Philipp Wich <[email protected]>
Tue, 18 Dec 2018 08:50:54 +0000 (09:50 +0100)
With a10a204aab26cc ("kernel: make ubi auto-attach check for a tar file
magic") the check for the magic was added without considering a failing
mtd_read(). If the read fails, no check is done and the mount code is
called straight away.

Failing with an error message for such cases seems to me the cleaner way,
as it would allow to spot hidden/workaround issues.

Signed-off-by: Mathias Kresin <[email protected]>
(backported from 3716b5e4e6374883c80e61021923733b14cdb011)
(rebased patches)
Signed-off-by: Jo-Philipp Wich <[email protected]>
target/linux/generic/pending-4.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch
target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch

index ff3490bf9e07781ff8ff192e60e508ae2a4a6b53..992aa4662e82e9f353e882d4df16cf99e8b0c061 100644 (file)
@@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle <[email protected]>
 
 --- a/drivers/mtd/ubi/build.c
 +++ b/drivers/mtd/ubi/build.c
-@@ -1172,6 +1172,68 @@ static struct mtd_info * __init open_mtd
+@@ -1172,6 +1172,73 @@ static struct mtd_info * __init open_mtd
        return mtd;
  }
  
@@ -44,10 +44,15 @@ Signed-off-by: Daniel Golle <[email protected]>
 +                      }
 +              }
 +
-+      /* check for a valid ubi magic if read from flash was successful */
++      /* check if the read from flash was successful */
 +      err = mtd_read(mtd, offset, 4, &len, (void *) magic);
-+      if ((!err || mtd_is_bitflip(err)) &&
-+          len == 4 && strncmp(magic, "UBI#", 4)) {
++      if ((err && !mtd_is_bitflip(err)) || len != 4) {
++              pr_err("UBI error: unable to read from mtd%d\n", mtd->index);
++              goto cleanup;
++      }
++
++      /* check for a valid ubi magic */
++      if (strncmp(magic, "UBI#", 4)) {
 +              pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
 +              goto cleanup;
 +      }
@@ -77,7 +82,7 @@ Signed-off-by: Daniel Golle <[email protected]>
  static int __init ubi_init(void)
  {
        int err, i, k;
-@@ -1255,6 +1317,12 @@ static int __init ubi_init(void)
+@@ -1255,6 +1322,12 @@ static int __init ubi_init(void)
                }
        }
  
index 8b923d17d6342e8fb2bb6b0aa5c041b3ccf5eeba..168cfe50ee4290f6df6f025167624de9d2c3bdfd 100644 (file)
@@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle <[email protected]>
 
 --- a/drivers/mtd/ubi/build.c
 +++ b/drivers/mtd/ubi/build.c
-@@ -1226,6 +1226,68 @@ static struct mtd_info * __init open_mtd
+@@ -1226,6 +1226,73 @@ static struct mtd_info * __init open_mtd
        return mtd;
  }
  
@@ -44,10 +44,15 @@ Signed-off-by: Daniel Golle <[email protected]>
 +                      }
 +              }
 +
-+      /* check for a valid ubi magic if read from flash was successful */
++      /* check if the read from flash was successful */
 +      err = mtd_read(mtd, offset, 4, &len, (void *) magic);
-+      if ((!err || mtd_is_bitflip(err)) &&
-+          len == 4 && strncmp(magic, "UBI#", 4)) {
++      if ((err && !mtd_is_bitflip(err)) || len != 4) {
++              pr_err("UBI error: unable to read from mtd%d\n", mtd->index);
++              goto cleanup;
++      }
++
++      /* check for a valid ubi magic */
++      if (strncmp(magic, "UBI#", 4)) {
 +              pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
 +              goto cleanup;
 +      }
@@ -77,7 +82,7 @@ Signed-off-by: Daniel Golle <[email protected]>
  static int __init ubi_init(void)
  {
        int err, i, k;
-@@ -1309,6 +1371,12 @@ static int __init ubi_init(void)
+@@ -1309,6 +1376,12 @@ static int __init ubi_init(void)
                }
        }