linux-stable/drivers/mtd
Artem Bityutskiy 0e707ae79b UBI: do propagate positive error codes up
UBI uses positive function return codes internally, and should not propagate
them up, except in the place this path fixes. Here is the original bug report
from Dan Carpenter:

The problem is really in ubi_eba_read_leb().

drivers/mtd/ubi/eba.c
   412                  err = ubi_io_read_vid_hdr(ubi, pnum, vid_hdr, 1);
   413                  if (err && err != UBI_IO_BITFLIPS) {
   414                          if (err > 0) {
   415                                  /*
   416                                   * The header is either absent or corrupted.
   417                                   * The former case means there is a bug -
   418                                   * switch to read-only mode just in case.
   419                                   * The latter case means a real corruption - we
   420                                   * may try to recover data. FIXME: but this is
   421                                   * not implemented.
   422                                   */
   423                                  if (err == UBI_IO_BAD_HDR_EBADMSG ||
   424                                      err == UBI_IO_BAD_HDR) {
   425                                          ubi_warn("corrupted VID header at PEB %d, LEB %d:%d",
   426                                                   pnum, vol_id, lnum);
   427                                          err = -EBADMSG;
   428                                  } else
   429                                          ubi_ro_mode(ubi);

On this path we return UBI_IO_FF and UBI_IO_FF_BITFLIPS and it
eventually gets passed to ERR_PTR().  We probably dereference the bad
pointer and oops.  At that point we've gone read only so it was already
a bad situation...

   430                          }
   431                          goto out_free;
   432                  } else if (err == UBI_IO_BITFLIPS)
   433                          scrub = 1;
   434

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
2015-01-28 16:09:25 +01:00
..
chips mtd: delete unnecessary checks before two function calls 2014-11-25 22:44:10 -08:00
devices MTD updates for 3.19: 2014-12-17 09:59:26 -08:00
lpddr mtd: lpddr: fix Kconfig dependency, for I/O accessors 2014-05-26 10:38:25 -07:00
maps MTD updates for 3.19: 2014-12-17 09:59:26 -08:00
nand MTD updates for 3.19: 2014-12-17 09:59:26 -08:00
onenand mtd: onenand: drop owner assignment from platform_drivers 2014-10-20 16:20:59 +02:00
spi-nor MTD updates for 3.19: 2014-12-17 09:59:26 -08:00
tests mtd: tests: abort torturetest on erase errors 2014-12-12 19:28:43 -08:00
ubi UBI: do propagate positive error codes up 2015-01-28 16:09:25 +01:00
afs.c
ar7part.c
bcm47xxpart.c mtd: bcm47xxpart: only register partitions if the trx header was filled 2014-10-22 02:04:34 -07:00
bcm63xxpart.c
cmdlinepart.c mtd: cmdlinepart: Spelling s/trucate/truncate/ 2014-07-02 15:17:15 -07:00
ftl.c mtd/ftl: fix the double free of the buffers allocated in build_maps() 2014-07-14 18:41:20 -07:00
inftlcore.c
inftlmount.c mtd: intflmount: fix off by one error in INFTL_dumpVUchains() 2014-11-05 13:19:21 -08:00
Kconfig mtd: update help of CONFIG_MTD_OF_PARTS 2014-11-05 01:17:56 -08:00
Makefile mtd: spi-nor: shorten Kconfig naming 2014-04-14 11:23:01 -07:00
mtd_blkdevs.c block: disable entropy contributions for nonrot devices 2014-10-04 10:55:32 -06:00
mtdblock.c
mtdblock_ro.c
mtdchar.c mtd: terminate user-provided string 2014-08-19 11:53:09 -07:00
mtdconcat.c
mtdcore.c mtd: remove dead non-char logic 2014-08-19 11:53:08 -07:00
mtdcore.h
mtdoops.c
mtdpart.c mtd: Account for BBT blocks when a partition is being allocated 2014-07-08 18:38:29 -07:00
mtdsuper.c
mtdswap.c mtd: use __packed shorthand 2014-08-19 11:53:08 -07:00
nftlcore.c
nftlmount.c
ofpart.c
redboot.c
rfd_ftl.c mtd: remove some duplicative checks 2014-03-10 22:42:25 -07:00
sm_ftl.c mtd: sm_ftl: initialize error code 2014-08-19 11:53:07 -07:00
sm_ftl.h
ssfdc.c