Browse Source

LibPartition: Fix end block off by one error

Previously, end block was inconsistent. GUIDPartitionTable treated
end block as an inclusive bound, while MBRPartitionTable and
EBRPartitionTable treated end block as an exclusive bound.
Now all three treat end block as an inclusive upper bound.
Samuel Bowman 3 years ago
parent
commit
2f8c20816e

+ 0 - 3
Userland/Applications/PartitionEditor/PartitionModel.cpp

@@ -42,9 +42,6 @@ GUI::Variant PartitionModel::data(GUI::ModelIndex const& index, GUI::ModelRole r
         case Column::StartBlock:
         case Column::StartBlock:
             return partition.start_block();
             return partition.start_block();
         case Column::EndBlock:
         case Column::EndBlock:
-            // FIXME: Either MBR end block is off by one (if supposed to be exclusive bound)
-            //        or GPT end block is off by one (if supposed to be inclusive bound).
-            //        This is an issue in LibPartition.
             return partition.end_block();
             return partition.end_block();
         default:
         default:
             VERIFY_NOT_REACHED();
             VERIFY_NOT_REACHED();

+ 1 - 1
Userland/Libraries/LibPartition/EBRPartitionTable.cpp

@@ -77,7 +77,7 @@ EBRPartitionTable::EBRPartitionTable(NonnullRefPtr<Core::File> device)
         if (entry.offset == 0x00) {
         if (entry.offset == 0x00) {
             continue;
             continue;
         }
         }
-        MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length), entry.type));
+        MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length) - 1, entry.type));
     }
     }
 }
 }
 
 

+ 2 - 2
Userland/Libraries/LibPartition/MBRPartitionTable.cpp

@@ -82,7 +82,7 @@ MBRPartitionTable::MBRPartitionTable(NonnullRefPtr<Core::File> device_file, u32
         if (entry.offset == 0x00) {
         if (entry.offset == 0x00) {
             continue;
             continue;
         }
         }
-        MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length), entry.type));
+        MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length) - 1, entry.type));
     }
     }
     m_valid = true;
     m_valid = true;
 }
 }
@@ -106,7 +106,7 @@ MBRPartitionTable::MBRPartitionTable(NonnullRefPtr<Core::File> device_file)
         if (entry.offset == 0x00) {
         if (entry.offset == 0x00) {
             continue;
             continue;
         }
         }
-        MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length), entry.type));
+        MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length) - 1, entry.type));
     }
     }
     m_valid = true;
     m_valid = true;
 }
 }