From a819cb1f12b5ba6657398a58ae014107e5be2d6b Mon Sep 17 00:00:00 2001 From: Raine Makelainen Date: Thu, 11 Jul 2019 16:40:35 +0300 Subject: [PATCH] [nemo-storage] Do not accept invalid block devices. Fixes JB#46420 A block device that is dm device must have crypto backing device. Clear partition wait timers when a block is removed. Also destroy block explicitly when block is removed. Previously we started another wait timer when block completed (after all interfaces were checked). --- src/udisks2block.cpp | 6 +++++- src/udisks2blockdevices.cpp | 22 ++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/udisks2block.cpp b/src/udisks2block.cpp index da03fd8..d2f1c58 100644 --- a/src/udisks2block.cpp +++ b/src/udisks2block.cpp @@ -267,7 +267,11 @@ bool UDisks2::Block::isExternal() const bool UDisks2::Block::isValid() const { - return m_interfacePropertyMap.contains(UDISKS2_BLOCK_INTERFACE); + bool hasBlock = m_interfacePropertyMap.contains(UDISKS2_BLOCK_INTERFACE); + if (hasBlock && device().startsWith(QStringLiteral("/dev/dm"))) { + return hasCryptoBackingDevice(); + } + return hasBlock; } QString UDisks2::Block::idType() const diff --git a/src/udisks2blockdevices.cpp b/src/udisks2blockdevices.cpp index c4f4266..c340ae5 100644 --- a/src/udisks2blockdevices.cpp +++ b/src/udisks2blockdevices.cpp @@ -66,8 +66,11 @@ bool BlockDevices::contains(const QString &dbusObjectPath) const void BlockDevices::remove(const QString &dbusObjectPath) { - Block *block = m_blockDevices.take(dbusObjectPath); - block->deleteLater(); + if (contains(dbusObjectPath)) { + Block *block = m_blockDevices.take(dbusObjectPath); + clearPartitionWait(dbusObjectPath, false); + delete block; + } } Block *BlockDevices::device(const QString &dbusObjectPath) const @@ -189,16 +192,22 @@ void BlockDevices::clearPartitionWait(const QString &dbusObjectPath, bool destro void BlockDevices::removeInterfaces(const QString &dbusObjectPath, const QStringList &interfaces) { - if (contains(dbusObjectPath)) { - UDisks2::Block *block = device(dbusObjectPath); + clearPartitionWait(dbusObjectPath, false); + + UDisks2::Block *block = device(dbusObjectPath); + if (block) { if (interfaces.contains(UDISKS2_FILESYSTEM_INTERFACE)) { block->removeInterface(UDISKS2_FILESYSTEM_INTERFACE); } if (interfaces.contains(UDISKS2_ENCRYPTED_INTERFACE)) { block->removeInterface(UDISKS2_ENCRYPTED_INTERFACE); } + + if (interfaces.contains(UDISKS2_BLOCK_INTERFACE)) { + delete block; + m_blockDevices.remove(dbusObjectPath); + } } - clearPartitionWait(dbusObjectPath, true); } bool BlockDevices::isExternal(const QString &dbusObjectPath) @@ -210,7 +219,8 @@ bool BlockDevices::isExternal(const QString &dbusObjectPath) void BlockDevices::blockCompleted() { Block *completedBlock = qobject_cast(sender()); - if (completedBlock->isPartitionTable() || (completedBlock->hasInterface(UDISKS2_BLOCK_INTERFACE) && completedBlock->interfaceCount() == 1)) { + if (completedBlock->isValid() && (completedBlock->isPartitionTable() || + (completedBlock->hasInterface(UDISKS2_BLOCK_INTERFACE) && completedBlock->interfaceCount() == 1)) ){ qCInfo(lcMemoryCardLog) << "Start waiting for block" << completedBlock->device(); waitPartition(completedBlock); return;