From 164cd970e574d21e0a74bdf406950e4e032ca34d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 21 Jul 2011 14:49:16 +0200 Subject: [PATCH] FileUtils: Add some safety checks to removeRecursively(). Change-Id: I657f8416081ce7d253f4a3ef9722a39ac34b5f24 Reviewed-on: http://codereview.qt.nokia.com/1955 Reviewed-by: Qt Sanity Bot Reviewed-by: Eike Ziller --- src/libs/utils/fileutils.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index b4eb010a4a..407b96abb6 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -100,14 +100,29 @@ bool FileUtils::removeRecursively(const QString &filePath, QString *error) QFile::setPermissions(filePath, fileInfo.permissions() | QFile::WriteUser); if (fileInfo.isDir()) { QDir dir(filePath); + dir = dir.canonicalPath(); + if (dir.isRoot()) { + if (error) { + *error = QCoreApplication::translate("Utils::FileUtils", + "Refusing to remove root directory."); + } + return false; + } + if (dir.path() == QDir::home().canonicalPath()) { + if (error) { + *error = QCoreApplication::translate("Utils::FileUtils", + "Refusing to remove your home directory."); + } + return false; + } + QStringList fileNames = dir.entryList(QDir::Files | QDir::Hidden | QDir::System | QDir::Dirs | QDir::NoDotAndDotDot); foreach (const QString &fileName, fileNames) { if (!removeRecursively(filePath + QLatin1Char('/') + fileName, error)) return false; } - dir.cdUp(); - if (!dir.rmdir(fileInfo.fileName())) { + if (!QDir::root().rmdir(dir.path())) { if (error) { *error = QCoreApplication::translate("Utils::FileUtils", "Failed to remove directory '%1'.") .arg(QDir::toNativeSeparators(filePath)); -- 2.11.0