summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sfx2/qa/cppunit/test_misc.cxx9
-rw-r--r--sfx2/source/doc/docfile.cxx11
2 files changed, 15 insertions, 5 deletions
diff --git a/sfx2/qa/cppunit/test_misc.cxx b/sfx2/qa/cppunit/test_misc.cxx
index 817e246b6bf6..ffe23997c12a 100644
--- a/sfx2/qa/cppunit/test_misc.cxx
+++ b/sfx2/qa/cppunit/test_misc.cxx
@@ -186,6 +186,15 @@ void MiscTest::testHardLinks()
// This failed: hard link count was 1, the hard link broke on store.
CPPUNIT_ASSERT(buf.st_nlink > 1);
+ // Test that symlinks are presreved as well.
+ remove(aNew.getStr());
+ symlink(aOld.getStr(), aNew.getStr());
+ xStorable->storeToURL(aURL + ".2", {});
+ nRet = lstat(aNew.getStr(), &buf);
+ CPPUNIT_ASSERT_EQUAL(0, nRet);
+ // This failed, the hello.odt.2 symlink was replaced with a real file.
+ CPPUNIT_ASSERT(bool(S_ISLNK(buf.st_mode)));
+
xComponent->dispose();
#endif
}
diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index 2e8b874deedb..e6a858ae6bf8 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -199,8 +199,8 @@ sal_uInt64 GetDefaultFileAttributes(const OUString& rURL)
return nRet;
}
-/// Determines if rURL is a non-hard-linked file:// URL.
-bool IsNotHardLinkedFile(const OUString& rURL)
+/// Determines if rURL is a non-linked (symlink or hardlink) file:// URL.
+bool IsNotLinkedFile(const OUString& rURL)
{
if (!comphelper::isFileUrl(rURL))
return false;
@@ -211,10 +211,11 @@ bool IsNotHardLinkedFile(const OUString& rURL)
return false;
struct stat buf;
- if (stat(rPath.toUtf8().getStr(), &buf) != 0)
+ if (lstat(rPath.toUtf8().getStr(), &buf) != 0)
return false;
- if (buf.st_nlink > 1)
+ // Hardlink or symlink: osl::File::move() doesn't play with these nicely.
+ if (buf.st_nlink > 1 || S_ISLNK(buf.st_mode))
return false;
#endif
@@ -1851,7 +1852,7 @@ void SfxMedium::TransactedTransferForFS_Impl( const INetURLObject& aSource,
OUString aDestMainURL = aDest.GetMainURL(INetURLObject::DecodeMechanism::NONE);
sal_uInt64 nAttributes = GetDefaultFileAttributes(aDestMainURL);
- if (IsNotHardLinkedFile(aDestMainURL) && osl::File::move(aSourceMainURL, aDestMainURL) == osl::FileBase::E_None)
+ if (IsNotLinkedFile(aDestMainURL) && osl::File::move(aSourceMainURL, aDestMainURL) == osl::FileBase::E_None)
{
if (nAttributes)
// Adjust attributes, source might be created with