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; } } }