sfx2/source/doc/docfile.cxx |    4 ++++
 1 file changed, 4 insertions(+)

New commits:
commit 5441ed518d36ac12a6bd0c517e2cfc24aff94d50
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Thu Mar 14 11:29:08 2024 -0400
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Mar 18 14:20:38 2024 +0100

    tdf#40244 tdf#160192: create tempFile elsewhere if LogicBase is RO
    
    This avoids a crash/infinite loop in specific read-only folder
    situation (where the lock file already exists).
    
    It also fixes ODF files giving three misleading/unclear
    notices when attempting to save into a read-only folder.
    
    When LO saves a file, it saves to a temporary file
    and then moves that file overtop of the previous one, IIUC.
    
    Prior to 6.1 5259ab8104cfba60c40748ed0cd59d93df038c5b
    that temporary file was stored in the /tmp directory (IIUC),
    but was changed to be in the same folder for easier renaming,
    same filesystem etc.
    
    Note that typically this situation would fail
    since a locking file also could not be created.
    However in the case where the lock file already exists,
    then all the pieces are in place to actually modify the document.
    
    By falling back to the /tmp folder if the document's folder
    is read-only, we can still modify a writeable document.
    
    Change-Id: Ie027fc05934f2c071f7a91007255801c179bff49
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164841
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index c90fb794f690..b58d27c95fa4 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -4038,6 +4038,8 @@ void SfxMedium::CreateTempFile( bool bReplace )
 
     OUString aLogicBase = GetLogicBase(GetURLObject(), pImpl);
     pImpl->pTempFile.reset(new ::utl::TempFileNamed(&aLogicBase));
+    if (!aLogicBase.isEmpty() && pImpl->pTempFile->GetFileName().isEmpty())
+        pImpl->pTempFile.reset(new ::utl::TempFileNamed());
     pImpl->pTempFile->EnableKillingFile();
     pImpl->m_aName = pImpl->pTempFile->GetFileName();
     OUString aTmpURL = pImpl->pTempFile->GetURL();
@@ -4134,6 +4136,8 @@ void SfxMedium::CreateTempFileNoCopy()
 
     OUString aLogicBase = GetLogicBase(GetURLObject(), pImpl);
     pImpl->pTempFile.reset(new ::utl::TempFileNamed(&aLogicBase));
+    if (!aLogicBase.isEmpty() && pImpl->pTempFile->GetFileName().isEmpty())
+        pImpl->pTempFile.reset(new ::utl::TempFileNamed());
     pImpl->pTempFile->EnableKillingFile();
     pImpl->m_aName = pImpl->pTempFile->GetFileName();
     if ( pImpl->m_aName.isEmpty() )

Reply via email to