blob: 3a99db0193dff4ed6a3f6d923df099cd29cca12e [file] [log] [blame]
From 23c86b29948f01e06984f82bf33716b880a75d96 Mon Sep 17 00:00:00 2001
From: Ray Donnelly <mingw.android@gmail.com>
Date: Mon, 30 Mar 2015 13:46:51 +0100
Subject: [PATCH 6/9] Don't remove files that live outside of path
If a file is symlinked outside of path in QInstaller::removeFiles
then it gets removed regardless. This will cause e.g. users' HOME
directories to get removed on MSYS2.
---
src/libs/installer/fileutils.cpp | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp
index 04a24ad..2ccca71 100644
--- a/src/libs/installer/fileutils.cpp
+++ b/src/libs/installer/fileutils.cpp
@@ -178,8 +178,30 @@ void QInstaller::removeFiles(const QString &path, bool ignoreErrors)
const QFileInfoList entries = QDir(path).entryInfoList(QDir::AllEntries | QDir::Hidden);
foreach (const QFileInfo &fi, entries) {
if (fi.isSymLink() || fi.isFile()) {
+ // Don't remove symlinks that point outside of path
+ // as this can delete for example, the HOME folder.
+ QFileInfo toRoot(fi);
+ QString prevToRoot;
+ bool symLinksOutsidePath = false;
+ do
+ {
+ if (toRoot.isSymLink()) {
+ QString symLinkTarget = toRoot.symLinkTarget();
+ if (symLinkTarget.indexOf(path) != 0) {
+ symLinksOutsidePath = true;
+ break;
+ }
+ }
+ prevToRoot = toRoot.absoluteFilePath();
+ toRoot = QFileInfo(toRoot.dir().absolutePath());
+ } while (toRoot.exists() && toRoot.dir().absolutePath() != prevToRoot);
QString filePath = fi.filePath();
QFile f(filePath);
+ if (symLinksOutsidePath) {
+ qDebug() << "Not removing " << f.fileName()
+ << " as it symlinks outside path " << path;
+ continue;
+ }
bool ok = f.remove();
if (!ok) { //ReadOnly can prevent removing in Windows. Change permission and try again.
const QFile::Permissions permissions = f.permissions();
--
2.7.0