Commit 18e95846 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] partition table validity checking

From: Andries Brouwer <Andries.Brouwer@cwi.nl>

The patch examines a putative partition table, and if that doesnt look like a
valid partition table it goes away again.

Some devices have partition tables (and there are many styles of such), some
don't.  Traditionally fixed disks have one, floppies don't.  Nobody knows what
happens with ZIP disks, USB sticks and other such things.  Both the DOS-type
partition table, and the "big floppy" whole disk FAT filesystem are common.
It is undesirable for the kernel to detect partitions where there are none.
This leads to great confusion, sometimes to kernel crashes.

In the particular case of DOS-type partition tables a partition entry has a
1-byte field boot_ind that traditionally is 0x80 for the boot partition and 0
for the other three primary partitions.  Linux does not use this field, and
one sometimes sees tables with all four entries zero.

The patch tells the kernel not to think that something is a valid DOS-type
partition table when a value other than 0 or 0x80 is encountered.  I think it
is a fairly safe change: I do not know of any fdisk-type program that will
write other values there.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 1df9796b
......@@ -389,8 +389,23 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev)
put_dev_sector(sect);
return 0;
}
/*
* Now that the 55aa signature is present, this is probably
* either the boot sector of a FAT filesystem or a DOS-type
* partition table. Reject this in case the boot indicator
* is not 0 or 0x80.
*/
p = (struct partition *) (data + 0x1be);
for (slot = 1; slot <= 4; slot++, p++) {
if (p->boot_ind != 0 && p->boot_ind != 0x80) {
put_dev_sector(sect);
return 0;
}
}
#ifdef CONFIG_EFI_PARTITION
p = (struct partition *) (data + 0x1be);
for (slot = 1 ; slot <= 4 ; slot++, p++) {
/* If this is an EFI GPT disk, msdos should ignore it. */
if (SYS_IND(p) == EFI_PMBR_OSTYPE_EFI_GPT) {
......@@ -398,8 +413,8 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev)
return 0;
}
}
p = (struct partition *) (data + 0x1be);
#endif
p = (struct partition *) (data + 0x1be);
/*
* Look for partitions in two passes:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment