1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
From 5d8e943787666543df6b858c001ab4e59b09fe2d Mon Sep 17 00:00:00 2001
From: Arseniy Shestakov <me@arseniyshestakov.com>
Date: Thu, 25 May 2017 03:03:02 +0300
Subject: [PATCH] Launcher: add sanity checks for QDir::removeRecursively.
Issue 2673
I'm not always fail to uninstall mod, but when I do I remove $HOME
Bumblebee developers should be proud of us...
---
launcher/modManager/cmodmanager.cpp | 22 ++++++++++++++++++++--
launcher/modManager/cmodmanager.h | 1 +
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/launcher/modManager/cmodmanager.cpp b/launcher/modManager/cmodmanager.cpp
index 59fd7faf..99a3df32 100644
--- a/launcher/modManager/cmodmanager.cpp
+++ b/launcher/modManager/cmodmanager.cpp
@@ -245,7 +245,7 @@ bool CModManager::doInstallMod(QString modname, QString archivePath)
if (!ZipArchive::extract(qstringToPath(archivePath), qstringToPath(destDir)))
{
- QDir(destDir + modDirName).removeRecursively();
+ removeModDir(destDir + modDirName);
return addError(modname, "Failed to extract mod data");
}
@@ -270,7 +270,7 @@ bool CModManager::doUninstallMod(QString modname)
if (!localMods.contains(modname))
return addError(modname, "Data with this mod was not found");
- if (!QDir(modDir).removeRecursively())
+ if (!removeModDir(modDir))
return addError(modname, "Failed to delete mod data");
localMods.remove(modname);
@@ -279,3 +279,21 @@ bool CModManager::doUninstallMod(QString modname)
return true;
}
+
+bool CModManager::removeModDir(QString path)
+{
+ // issues 2673 and 2680 its why you do not recursively remove without sanity check
+ QDir checkDir(path);
+ if(!checkDir.cdUp() || QString::compare("Mods", checkDir.dirName(), Qt::CaseInsensitive))
+ return false;
+ if(!checkDir.cdUp() || QString::compare("vcmi", checkDir.dirName(), Qt::CaseInsensitive))
+ return false;
+
+ QDir dir(path);
+ if(!dir.absolutePath().contains("vcmi", Qt::CaseInsensitive))
+ return false;
+ if(!dir.absolutePath().contains("Mods", Qt::CaseInsensitive))
+ return false;
+
+ return dir.removeRecursively();
+}
diff --git a/launcher/modManager/cmodmanager.h b/launcher/modManager/cmodmanager.h
index 800db6b5..b759ef06 100644
--- a/launcher/modManager/cmodmanager.h
+++ b/launcher/modManager/cmodmanager.h
@@ -18,6 +18,7 @@ class CModManager
QStringList recentErrors;
bool addError(QString modname, QString message);
+ bool removeModDir(QString mod);
public:
CModManager(CModList * modList);
--
2.11.0
|