diff --git a/FsCrypt.cpp b/FsCrypt.cpp index 7ba3162..b60747a 100644 --- a/FsCrypt.cpp +++ b/FsCrypt.cpp @@ -1137,7 +1137,10 @@ static bool destroy_volume_keys(const std::string& directory_path, const std::st return res; } +// Destroys all CE and DE keys for an adoptable storage volume that is permanently going away. +// Requires VolumeManager::mCryptLock. bool fscrypt_destroy_volume_keys(const std::string& volume_uuid) { + if (!IsFbeEnabled()) return true; bool res = true; LOG(DEBUG) << "fscrypt_destroy_volume_keys for volume " << escape_empty(volume_uuid); auto secdiscardable_path = volume_secdiscardable_path(volume_uuid); diff --git a/VoldNativeService.cpp b/VoldNativeService.cpp index bcca50a..d51652b 100644 --- a/VoldNativeService.cpp +++ b/VoldNativeService.cpp @@ -256,9 +256,19 @@ binder::Status VoldNativeService::forgetPartition(const std::string& partGuid, ENFORCE_SYSTEM_OR_ROOT; CHECK_ARGUMENT_HEX(partGuid); CHECK_ARGUMENT_HEX(fsUuid); - ACQUIRE_LOCK; + bool success = true; - return translate(VolumeManager::Instance()->forgetPartition(partGuid, fsUuid)); + { + ACQUIRE_LOCK; + success &= VolumeManager::Instance()->forgetPartition(partGuid, fsUuid); + } + + { + ACQUIRE_CRYPT_LOCK; + success &= fscrypt_destroy_volume_keys(fsUuid); + } + + return translateBool(success); } binder::Status VoldNativeService::mount( diff --git a/VolumeManager.cpp b/VolumeManager.cpp index db356db..c981f2d 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -349,25 +349,19 @@ void VolumeManager::listVolumes(android::vold::VolumeBase::Type type, } } -int VolumeManager::forgetPartition(const std::string& partGuid, const std::string& fsUuid) { +bool VolumeManager::forgetPartition(const std::string& partGuid, const std::string& fsUuid) { std::string normalizedGuid; if (android::vold::NormalizeHex(partGuid, normalizedGuid)) { LOG(WARNING) << "Invalid GUID " << partGuid; - return -1; + return false; } - bool success = true; std::string keyPath = android::vold::BuildKeyPath(normalizedGuid); if (unlink(keyPath.c_str()) != 0) { LOG(ERROR) << "Failed to unlink " << keyPath; - success = false; + return false; } - if (IsFbeEnabled()) { - if (!fscrypt_destroy_volume_keys(fsUuid)) { - success = false; - } - } - return success ? 0 : -1; + return true; } void VolumeManager::destroyEmulatedVolumesForUser(userid_t userId) { diff --git a/VolumeManager.h b/VolumeManager.h index 2d6b968..fb6081f 100644 --- a/VolumeManager.h +++ b/VolumeManager.h @@ -106,7 +106,7 @@ class VolumeManager { userid_t getSharedStorageUser(userid_t userId); - int forgetPartition(const std::string& partGuid, const std::string& fsUuid); + bool forgetPartition(const std::string& partGuid, const std::string& fsUuid); int onUserAdded(userid_t userId, int userSerialNumber, userid_t cloneParentUserId); int onUserRemoved(userid_t userId);