From 311049d75104d6ff977feb56c5eb76c0761a8dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 4 Apr 2005 14:01:34 +0000 Subject: [PATCH] Added a new PartitionMap::CountNonEmptyPartitions() - now, a partition map is only accepted when there is at least one valid partition in it. Before, the module would accept even the BFS boot loader which is now less likely (IOW you can now boot with Bochs again). Also, if there was one invalid partition, the partitions that come after it are no longer ignored. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12228 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../partitioning_systems/intel/PartitionMap.cpp | 13 +++++++++++++ .../partitioning_systems/intel/PartitionMap.h | 1 + .../intel/PartitionMapParser.cpp | 9 +++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.cpp b/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.cpp index 8380d87a4f..dfd303ab8d 100644 --- a/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.cpp +++ b/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.cpp @@ -327,6 +327,19 @@ PartitionMap::CountPartitions() const return count; } +// CountNonEmptyPartitions +int32 +PartitionMap::CountNonEmptyPartitions() const +{ + int32 count = 0; + for (int32 i = CountPartitions() - 1; i >= 0; i--) { + if (!PartitionAt(i)->IsEmpty()) + count++; + } + + return count; +} + // PartitionAt Partition * PartitionMap::PartitionAt(int32 index) diff --git a/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h b/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h index ad8cb545fb..f0ec383f20 100644 --- a/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h +++ b/src/add-ons/kernel/partitioning_systems/intel/PartitionMap.h @@ -164,6 +164,7 @@ public: const PrimaryPartition *PrimaryPartitionAt(int32 index) const; int32 CountPartitions() const; + int32 CountNonEmptyPartitions() const; Partition *PartitionAt(int32 index); const Partition *PartitionAt(int32 index) const; diff --git a/src/add-ons/kernel/partitioning_systems/intel/PartitionMapParser.cpp b/src/add-ons/kernel/partitioning_systems/intel/PartitionMapParser.cpp index 435ef5ed6c..a6aa90fa9d 100644 --- a/src/add-ons/kernel/partitioning_systems/intel/PartitionMapParser.cpp +++ b/src/add-ons/kernel/partitioning_systems/intel/PartitionMapParser.cpp @@ -53,8 +53,14 @@ PartitionMapParser::Parse(const uint8 *block, PartitionMap *map) if (error == B_OK) error = _ParsePrimary(&pts); } - if (error == B_OK && !fMap->Check(fSessionSize, fBlockSize)) + + // If we don't have any partitions it might also just be an + // empty partition map, but we still can't do much with it + if (error == B_OK + && (fMap->CountNonEmptyPartitions() == 0 + || !fMap->Check(fSessionSize, fBlockSize))) { error = B_BAD_DATA; + } fMap = NULL; } return error; @@ -81,7 +87,6 @@ PartitionMapParser::_ParsePrimary(const partition_table_sector *pts) TRACE(("intel: _ParsePrimary(): partition %ld: bad location, " "ignoring\n")); partition->Unset(); - break; } } }