Kaydet (Commit) 72be5ac0 authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#119381 sfx2 store: don't break symlink targets

osl::File::move() would not follow symlinks for the target, so don't
move the file in that case.

Change-Id: I907e1ba8db04dad670c884ea0283947f953117da
Reviewed-on: https://gerrit.libreoffice.org/59949
Tested-by: Jenkins
Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
üst b9757f5c
......@@ -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
}
......
......@@ -200,8 +200,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;
......@@ -212,10 +212,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
......@@ -1843,7 +1844,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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment