From 90a2e482be76862add04577de6fc9fdbd2d30b4d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 10:56:06 -0400 Subject: [PATCH] [partition] Check for available partition type before creating - Avoid situation where you make 5 or more primaries in an MSDOS partition table. FIXES #953 --- src/modules/partition/gui/PartitionPage.cpp | 27 +++++++++++++++++++++ src/modules/partition/gui/PartitionPage.h | 8 ++++++ 2 files changed, 35 insertions(+) diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 62f82a108..426667a08 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -34,6 +34,7 @@ #include "ui_PartitionPage.h" #include "ui_CreatePartitionTableDialog.h" +#include "utils/Logger.h" #include "utils/Retranslator.h" #include "Branding.h" #include "JobQueue.h" @@ -178,6 +179,29 @@ PartitionPage::onNewPartitionTableClicked() updateBootLoaderIndex(); } +bool +PartitionPage::checkCanCreate( Device* device ) +{ + auto table = device->partitionTable(); + + if ( table->type() == PartitionTable::msdos ||table->type() == PartitionTable::msdos_sectorbased ) + { + cDebug() << "Checking MSDOS partition" << table->numPrimaries() << "primaries, max" << table->maxPrimaries(); + + if ( ( table->numPrimaries() >= table->maxPrimaries() ) && !table->hasExtended() ) + { + QMessageBox::warning( this, tr( "Can not create new partition" ), + tr( "The partition table on %1 already has %2 primary partitions, and no more can be added. " + "Please remove one primary partition and add an extended partition, instead." ).arg( device->name() ).arg( table->numPrimaries() ) + ); + return false; + } + return true; + } + else + return true; // GPT is fine +} + void PartitionPage::onCreateClicked() { @@ -188,6 +212,9 @@ PartitionPage::onCreateClicked() Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); + if ( !checkCanCreate( model->device() ) ) + return; + QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( model->device(), partition->parent(), nullptr, diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h index 24cf65675..d7c823a61 100644 --- a/src/modules/partition/gui/PartitionPage.h +++ b/src/modules/partition/gui/PartitionPage.h @@ -62,6 +62,14 @@ private: void updateFromCurrentDevice(); void updateBootLoaderIndex(); + /** + * @brief Check if a new partition can be created (as primary) on the device. + * + * Returns true if a new partition can be created on the device. Provides + * a warning popup and returns false if it cannot. + */ + bool checkCanCreate( Device* ); + QStringList getCurrentUsedMountpoints(); QMutex m_revertMutex;