unotools/source/ucbhelper/tempfile.cxx |   91 +++++++++++++++++----------------
 1 file changed, 48 insertions(+), 43 deletions(-)

New commits:
commit 22803ccf93284807dee037a5aafb3a040d6868a7
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Mon Feb 19 11:05:55 2024 +0600
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Mon Feb 19 13:05:34 2024 +0600

    tdf#159769: always make sure that default temporary directory exists
    
    This basically undoes commit 4743a32b4f991c57e4b8a66adf035b1808ca793a
    (only need to create the folder for temp files once, 2022-05-18). To
    avoid the overhead in TempFileFast, it now uses a new function to get
    the path, which doesn't check that path exists.
    
    Change-Id: I9c910a55dc4992058a7168690561b02d682b5e56
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163576
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/unotools/source/ucbhelper/tempfile.cxx 
b/unotools/source/ucbhelper/tempfile.cxx
index 2cf7a94ec5ed..eff57dfdaddb 100644
--- a/unotools/source/ucbhelper/tempfile.cxx
+++ b/unotools/source/ucbhelper/tempfile.cxx
@@ -46,13 +46,23 @@ using namespace osl;
 
 namespace
 {
-    OUString gTempNameBase_Impl;
+OUString gTempNameBase_Impl;
+
+OUString ensureTrailingSlash(const OUString& url)
+{
+    if (!url.isEmpty() && !url.endsWith("/"))
+        return url + "/";
+    return url;
 }
 
-namespace utl
+OUString stripTrailingSlash(const OUString& url)
 {
+    if (url.endsWith("/"))
+        return url.copy(0, url.getLength() - 1);
+    return url;
+}
 
-static OUString getParentName( std::u16string_view aFileName )
+OUString getParentName( std::u16string_view aFileName )
 {
     size_t lastIndex = aFileName.rfind( '/' );
     OUString aParent;
@@ -71,17 +81,14 @@ static OUString getParentName( std::u16string_view 
aFileName )
     return aParent;
 }
 
-static bool ensuredir( const OUString& rUnqPath )
+bool ensuredir( const OUString& rUnqPath )
 {
     OUString aPath;
     if ( rUnqPath.isEmpty() )
         return false;
 
     // remove trailing slash
-    if ( rUnqPath.endsWith("/") )
-        aPath = rUnqPath.copy( 0, rUnqPath.getLength() - 1 );
-    else
-        aPath = rUnqPath;
+    aPath = stripTrailingSlash(rUnqPath);
 
     // HACK: create directory on a mount point with nobrowse option
     // returns ENOSYS in any case !!
@@ -115,7 +122,24 @@ static bool ensuredir( const OUString& rUnqPath )
     return bSuccess;
 }
 
-static OUString ConstructTempDir_Impl( const OUString* pParent, bool 
bCreateParentDirs )
+const OUString& getTempNameBase_Impl()
+{
+    if (gTempNameBase_Impl.isEmpty())
+    {
+        OUString ustrTempDirURL;
+        osl::FileBase::RC rc = osl::File::getTempDirURL(ustrTempDirURL);
+        if (rc == osl::FileBase::E_None)
+        {
+            gTempNameBase_Impl = ensureTrailingSlash(ustrTempDirURL);
+            ensuredir(gTempNameBase_Impl);
+        }
+    }
+    assert(gTempNameBase_Impl.isEmpty() || gTempNameBase_Impl.endsWith("/"));
+    DBG_ASSERT(!gTempNameBase_Impl.isEmpty(), "No TempDir!");
+    return gTempNameBase_Impl;
+}
+
+OUString ConstructTempDir_Impl( const OUString* pParent, bool 
bCreateParentDirs )
 {
     OUString aName;
 
@@ -147,29 +171,15 @@ static OUString ConstructTempDir_Impl( const OUString* 
pParent, bool bCreatePare
 
     if ( aName.isEmpty() )
     {
-        if (gTempNameBase_Impl.isEmpty())
-        {
-            OUString ustrTempDirURL;
-            ::osl::FileBase::RC rc = ::osl::File::getTempDirURL(
-                ustrTempDirURL );
-            if (rc == ::osl::FileBase::E_None)
-                gTempNameBase_Impl = ustrTempDirURL;
-            ensuredir( aName );
-        }
         // if no parent or invalid parent : use default directory
-        DBG_ASSERT( !gTempNameBase_Impl.isEmpty(), "No TempDir!" );
-        aName = gTempNameBase_Impl;
+        aName = getTempNameBase_Impl();
+        ensuredir(aName); // tdf#159769: always make sure it exists
     }
 
     // Make sure that directory ends with a separator
-    if( !aName.isEmpty() && !aName.endsWith("/") )
-        aName += "/";
-
-    return aName;
+    return ensureTrailingSlash(aName);
 }
 
-namespace {
-
 class Tokens {
 public:
     virtual bool next(OUString *) = 0;
@@ -233,12 +243,8 @@ private:
     sal_uInt32 m_count;
 };
 
-}
-
 sal_uInt32 UniqueTokens::globalValue = SAL_MAX_UINT32;
 
-namespace
-{
     class TempDirCreatedObserver : public DirectoryCreationObserver
     {
     public:
@@ -248,9 +254,8 @@ namespace
                 osl_File_Attribute_OwnWrite | osl_File_Attribute_OwnExe );
         };
     };
-};
 
-static OUString lcl_createName(
+OUString lcl_createName(
     std::u16string_view rLeadingChars, Tokens & tokens, std::u16string_view 
pExtension,
     const OUString* pParent, bool bDirectory, bool bKeep, bool bLock,
     bool bCreateParentDirs )
@@ -326,7 +331,7 @@ static OUString lcl_createName(
     return OUString();
 }
 
-static OUString CreateTempName_Impl( const OUString* pParent, bool bKeep, bool 
bDir = true )
+OUString CreateTempName_Impl( const OUString* pParent, bool bKeep, bool bDir = 
true )
 {
     OUString aEyeCatcher = "lu";
 #ifdef UNX
@@ -351,7 +356,7 @@ static OUString CreateTempName_Impl( const OUString* 
pParent, bool bKeep, bool b
                            false, false);
 }
 
-static OUString CreateTempNameFast()
+OUString CreateTempNameFast()
 {
     OUString aEyeCatcher = "lu";
 #ifdef UNX
@@ -372,12 +377,16 @@ static OUString CreateTempNameFast()
     aEyeCatcher += aPidString;
 #endif
 
-    OUString aName = ConstructTempDir_Impl( /*pParent*/nullptr, 
/*bCreateParentDirs*/false ) + aEyeCatcher;
+    OUString aName = getTempNameBase_Impl() + aEyeCatcher;
 
     tools::Guid aGuid(tools::Guid::Generate);
 
     return aName + aGuid.getOUString() + ".tmp" ;
 }
+}
+
+namespace utl
+{
 
 OUString CreateTempName()
 {
@@ -538,11 +547,8 @@ OUString SetTempNameBaseDirectory( const OUString 
&rBaseName )
     if( rBaseName.isEmpty() )
         return OUString();
 
-    OUString aUnqPath( rBaseName );
-
     // remove trailing slash
-    if ( rBaseName.endsWith("/") )
-        aUnqPath = rBaseName.copy( 0, rBaseName.getLength() - 1 );
+    OUString aUnqPath(stripTrailingSlash(rBaseName));
 
     // try to create the directory
     bool bRet = false;
@@ -558,16 +564,15 @@ OUString SetTempNameBaseDirectory( const OUString 
&rBaseName )
     if ( bRet )
     {
         // append own internal directory
-        OUString &rTempNameBase_Impl = gTempNameBase_Impl;
-        rTempNameBase_Impl = rBaseName + "/";
+        gTempNameBase_Impl = ensureTrailingSlash(rBaseName);
 
         TempFileNamed aBase( {}, true );
         if ( aBase.IsValid() )
             // use it in case of success
-            rTempNameBase_Impl = aBase.aName;
+            gTempNameBase_Impl = ensureTrailingSlash(aBase.aName);
 
         // return system path of used directory
-        FileBase::getSystemPathFromFileURL( rTempNameBase_Impl, aTmp );
+        FileBase::getSystemPathFromFileURL(gTempNameBase_Impl, aTmp);
     }
 
     return aTmp;

Reply via email to