| From fa7ea87a057958a8b7926c1a60a3ca6d696328ed Mon Sep 17 00:00:00 2001 |
| From: Timo Warns <warns@pre-sense.de> |
| Date: Thu, 17 Feb 2011 22:27:40 +0100 |
| Subject: fs/partitions: Validate map_count in Mac partition tables |
| |
| From: Timo Warns <warns@pre-sense.de> |
| |
| commit fa7ea87a057958a8b7926c1a60a3ca6d696328ed upstream. |
| |
| Validate number of blocks in map and remove redundant variable. |
| |
| Signed-off-by: Timo Warns <warns@pre-sense.de> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/partitions/mac.c | 17 +++++++++-------- |
| 1 file changed, 9 insertions(+), 8 deletions(-) |
| |
| --- a/fs/partitions/mac.c |
| +++ b/fs/partitions/mac.c |
| @@ -29,10 +29,9 @@ static inline void mac_fix_string(char * |
| |
| int mac_partition(struct parsed_partitions *state, struct block_device *bdev) |
| { |
| - int slot = 1; |
| Sector sect; |
| unsigned char *data; |
| - int blk, blocks_in_map; |
| + int slot, blocks_in_map; |
| unsigned secsize; |
| #ifdef CONFIG_PPC_PMAC |
| int found_root = 0; |
| @@ -59,10 +58,14 @@ int mac_partition(struct parsed_partitio |
| put_dev_sector(sect); |
| return 0; /* not a MacOS disk */ |
| } |
| - printk(" [mac]"); |
| blocks_in_map = be32_to_cpu(part->map_count); |
| - for (blk = 1; blk <= blocks_in_map; ++blk) { |
| - int pos = blk * secsize; |
| + if (blocks_in_map < 0 || blocks_in_map >= DISK_MAX_PARTS) { |
| + put_dev_sector(sect); |
| + return 0; |
| + } |
| + printk(" [mac]"); |
| + for (slot = 1; slot <= blocks_in_map; ++slot) { |
| + int pos = slot * secsize; |
| put_dev_sector(sect); |
| data = read_dev_sector(bdev, pos/512, §); |
| if (!data) |
| @@ -113,13 +116,11 @@ int mac_partition(struct parsed_partitio |
| } |
| |
| if (goodness > found_root_goodness) { |
| - found_root = blk; |
| + found_root = slot; |
| found_root_goodness = goodness; |
| } |
| } |
| #endif /* CONFIG_PPC_PMAC */ |
| - |
| - ++slot; |
| } |
| #ifdef CONFIG_PPC_PMAC |
| if (found_root_goodness) |