96 lines
3.5 KiB
Diff
96 lines
3.5 KiB
Diff
|
From 8769b6360d87c1b688eac4d0ce97594351bad13c Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?M=C3=A9ven=20Car?= <meven29@gmail.com>
|
||
|
Date: Fri, 15 May 2020 12:44:35 +0200
|
||
|
Subject: CopyJob: Check if destination dir is a symlink
|
||
|
|
||
|
Summary:
|
||
|
BUG: 421213
|
||
|
FIXED-IN: 5.71
|
||
|
|
||
|
Test Plan: ctest
|
||
|
|
||
|
Reviewers: #frameworks, dfaure, ngraham
|
||
|
|
||
|
Reviewed By: dfaure
|
||
|
|
||
|
Subscribers: kde-frameworks-devel
|
||
|
|
||
|
Tags: #frameworks
|
||
|
|
||
|
Differential Revision: https://phabricator.kde.org/D29767
|
||
|
---
|
||
|
autotests/jobtest.cpp | 30 ++++++++++++++++++++++++++++++
|
||
|
autotests/jobtest.h | 1 +
|
||
|
src/core/copyjob.cpp | 2 +-
|
||
|
3 files changed, 32 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/autotests/jobtest.cpp b/autotests/jobtest.cpp
|
||
|
index 5d5117a..0602319 100644
|
||
|
--- a/autotests/jobtest.cpp
|
||
|
+++ b/autotests/jobtest.cpp
|
||
|
@@ -619,6 +619,36 @@ void JobTest::copyDirectoryToExistingDirectory()
|
||
|
copyLocalDirectory(src, dest, AlreadyExists);
|
||
|
}
|
||
|
|
||
|
+void JobTest::copyDirectoryToExistingSymlinkedDirectory()
|
||
|
+{
|
||
|
+ // qDebug();
|
||
|
+ // just the same as copyDirectoryToSamePartition, but this time dest is a symlink.
|
||
|
+ // So we get a file in the symlink dir, "dirFromHome_symlink/dirFromHome" and
|
||
|
+ // "dirFromHome_symOrigin/dirFromHome"
|
||
|
+ const QString src = homeTmpDir() + "dirFromHome";
|
||
|
+ const QString origSymlink = homeTmpDir() + "dirFromHome_symOrigin";
|
||
|
+ const QString targetSymlink = homeTmpDir() + "dirFromHome_symlink";
|
||
|
+ createTestDirectory(src);
|
||
|
+ createTestDirectory(origSymlink);
|
||
|
+
|
||
|
+ bool ok = KIOPrivate::createSymlink(origSymlink, targetSymlink);
|
||
|
+ if (!ok) {
|
||
|
+ qFatal("couldn't create symlink: %s", strerror(errno));
|
||
|
+ }
|
||
|
+ QVERIFY(QFileInfo(targetSymlink).isSymLink());
|
||
|
+ QVERIFY(QFileInfo(targetSymlink).isDir());
|
||
|
+
|
||
|
+ KIO::Job *job = KIO::copy(QUrl::fromLocalFile(src), QUrl::fromLocalFile(targetSymlink), KIO::HideProgressInfo);
|
||
|
+ job->setUiDelegate(nullptr);
|
||
|
+ job->setUiDelegateExtension(nullptr);
|
||
|
+ QVERIFY2(job->exec(), qPrintable(job->errorString()));
|
||
|
+ QVERIFY(QFile::exists(src)); // still there
|
||
|
+
|
||
|
+ // file is visible in both places due to symlink
|
||
|
+ QVERIFY(QFileInfo(origSymlink + "/dirFromHome").isDir());;
|
||
|
+ QVERIFY(QFileInfo(targetSymlink + "/dirFromHome").isDir());
|
||
|
+}
|
||
|
+
|
||
|
void JobTest::copyFileToOtherPartition()
|
||
|
{
|
||
|
// qDebug();
|
||
|
diff --git a/autotests/jobtest.h b/autotests/jobtest.h
|
||
|
index d8ac33f..9ebb2ad 100644
|
||
|
--- a/autotests/jobtest.h
|
||
|
+++ b/autotests/jobtest.h
|
||
|
@@ -49,6 +49,7 @@ private Q_SLOTS:
|
||
|
void copyFileToSamePartition();
|
||
|
void copyDirectoryToSamePartition();
|
||
|
void copyDirectoryToExistingDirectory();
|
||
|
+ void copyDirectoryToExistingSymlinkedDirectory();
|
||
|
void copyFileToOtherPartition();
|
||
|
void copyDirectoryToOtherPartition();
|
||
|
void copyRelativeSymlinkToSamePartition();
|
||
|
diff --git a/src/core/copyjob.cpp b/src/core/copyjob.cpp
|
||
|
index 06e0612..ec15543 100644
|
||
|
--- a/src/core/copyjob.cpp
|
||
|
+++ b/src/core/copyjob.cpp
|
||
|
@@ -366,7 +366,7 @@ void CopyJobPrivate::slotStart()
|
||
|
state = STATE_STATING;
|
||
|
const QUrl dest = m_asMethod ? m_dest.adjusted(QUrl::RemoveFilename) : m_dest;
|
||
|
// We need isDir() and UDS_LOCAL_PATH (for slaves who set it). Let's assume the latter is part of StatBasic too.
|
||
|
- KIO::Job *job = KIO::statDetails(dest, StatJob::DestinationSide, KIO::StatBasic, KIO::HideProgressInfo);
|
||
|
+ KIO::Job *job = KIO::statDetails(dest, StatJob::DestinationSide, KIO::StatBasic | KIO::StatResolveSymlink, KIO::HideProgressInfo);
|
||
|
qCDebug(KIO_COPYJOB_DEBUG) << "CopyJob: stating the dest" << dest;
|
||
|
q->addSubjob(job);
|
||
|
}
|
||
|
--
|
||
|
cgit v1.1
|
||
|
|