linux/fs/partitions
Kay Sievers ac0d86f580 block: sanitize invalid partition table entries
We currently follow blindly what the partition table lies about the
disk, and let the kernel create block devices which can not be accessed.
Trying to identify the device leads to kernel logs full of:
  sdb: rw=0, want=73392, limit=28800
  attempt to access beyond end of device

Here is an example of a broken partition table, where sda2 starts
behind the end of the disk, and sdb3 is larger than the entire disk:
  Disk /dev/sdb: 14 MB, 14745600 bytes
  1 heads, 29 sectors/track, 993 cylinders, total 28800 sectors
     Device Boot      Start         End      Blocks   Id  System
  /dev/sdb1              29        7800        3886   83  Linux
  /dev/sdb2           37801       45601        3900+  83  Linux
  /dev/sdb3           15602       73402       28900+  83  Linux
  /dev/sdb4           23403       28796        2697   83  Linux

The kernel creates these completely invalid devices, which can not be
accessed, or may lead to other unpredictable failures:
  grep . /sys/class/block/sdb*/{start,size}
  /sys/class/block/sdb/size:28800
  /sys/class/block/sdb1/start:29
  /sys/class/block/sdb1/size:7772
  /sys/class/block/sdb2/start:37801
  /sys/class/block/sdb2/size:7801
  /sys/class/block/sdb3/start:15602
  /sys/class/block/sdb3/size:57801
  /sys/class/block/sdb4/start:23403
  /sys/class/block/sdb4/size:5394

With this patch, we ignore partitions which start behind the end of the disk,
and limit partitions to the end of the disk if they pretend to be larger:
  grep . /sys/class/block/sdb*/{start,size}
  /sys/class/block/sdb/size:28800
  /sys/class/block/sdb1/start:29
  /sys/class/block/sdb1/size:7772
  /sys/class/block/sdb3/start:15602
  /sys/class/block/sdb3/size:13198
  /sys/class/block/sdb4/start:23403
  /sys/class/block/sdb4/size:5394

These warnings are printed to the kernel log:
  sdb: p2 ignored, start 37801 is behind the end of the disk
  sdb: p3 size 57801 limited to end of disk

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Cc: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-10-16 11:21:47 -07:00
..
acorn.c fs/partitions/acorn.c: remove dead code 2008-10-16 11:21:47 -07:00
acorn.h
amiga.c [PATCH] Fix check_partition routines 2006-12-07 08:39:30 -08:00
amiga.h
atari.c [PATCH] Fix check_partition routines 2006-12-07 08:39:30 -08:00
atari.h
check.c block: sanitize invalid partition table entries 2008-10-16 11:21:47 -07:00
check.h block: replace @ext_minors with GENHD_FL_EXT_DEVT 2008-10-09 08:56:08 +02:00
efi.c fs/partitions/efi: convert to pr_debug 2008-07-25 10:53:44 -07:00
efi.h Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
ibm.c [S390] fixed cdl-format detection. 2007-07-10 11:24:44 +02:00
ibm.h
karma.c
karma.h
Kconfig partition: use DEFAULT_SGI_PARTITION for SGI_PARTION default 2008-02-06 10:41:08 -08:00
ldm.c fs: ldm.[ch] use get_unaligned_* helpers 2008-07-25 10:53:26 -07:00
ldm.h fs: ldm.[ch] use get_unaligned_* helpers 2008-07-25 10:53:26 -07:00
mac.c [PATCH] Enable RAID autorun on Mac partition tables. 2006-12-04 08:36:37 -08:00
mac.h
Makefile partition: add support for sysv68 partitions 2007-05-08 11:15:09 -07:00
msdos.c fat: detect media without partition table correctly 2008-04-28 08:58:47 -07:00
msdos.h
osf.c
osf.h
sgi.c [PARTITION]: Add whole_disk attribute. 2007-02-10 23:50:00 -08:00
sgi.h
sun.c fs/partitions/sun.c endianness annotations 2007-10-14 12:41:51 -07:00
sun.h [PARTITION]: Sun/Solaris VTOC table corrections 2007-07-30 00:27:31 -07:00
sysv68.c partition: add support for sysv68 partitions 2007-05-08 11:15:09 -07:00
sysv68.h partition: add support for sysv68 partitions 2007-05-08 11:15:09 -07:00
ultrix.c
ultrix.h