[Libreoffice-commits] core.git: comphelper/source include/comphelper

Jan-Marek Glogowski (via logerrit) logerrit at kemper.freedesktop.org
Sat Sep 18 15:18:17 UTC 2021


 comphelper/source/misc/DirectoryHelper.cxx |   11 +++++++++--
 include/comphelper/DirectoryHelper.hxx     |    2 ++
 2 files changed, 11 insertions(+), 2 deletions(-)

New commits:
commit 3eb58057b0a936ba76d1a5a587f9bda2dccfe862
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Sat Sep 18 02:08:24 2021 +0200
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Sat Sep 18 17:17:43 2021 +0200

    URI-encode DirectoryHelper::scanDirsAndFiles result
    
    All code assumes the result is usable as URI segments.
    
    This fails DirectoryHelper::deleteDirRecursively with files
    like org.openoffice.da.hunspell.dictionaries%2Fpage1.xhp,
    resulting in an unlimited startup loop after creating a
    new user profile via:
    
    $ soffice -env:UserInstallation=file:///tmp/test --safe-mode
    $ soffice -env:UserInstallation=file:///tmp/test
    
    So just URI encode all files and directories returned.
    
    This doesn't fix the general problem handling "regular"
    DirectoryHelper::deleteDirRecursively failures on startup.
    
    Change-Id: I48aa9816118e19302eb93387bdd741bf27fa7236
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122292
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/comphelper/source/misc/DirectoryHelper.cxx b/comphelper/source/misc/DirectoryHelper.cxx
index 4ac2dfe7e829..f444d9450664 100644
--- a/comphelper/source/misc/DirectoryHelper.cxx
+++ b/comphelper/source/misc/DirectoryHelper.cxx
@@ -11,6 +11,7 @@
 
 #include <sal/config.h>
 #include <osl/file.hxx>
+#include <rtl/uri.hxx>
 
 #include <memory>
 
@@ -77,6 +78,11 @@ void DirectoryHelper::scanDirsAndFiles(const OUString& rDirURL, std::set<OUStrin
     if (osl::FileBase::E_None != aDirectory.open())
         return;
 
+    auto lcl_encodeUriSegment = [](OUString const& rPath) {
+        return rtl::Uri::encode(rPath, rtl_UriCharClassUricNoSlash, rtl_UriEncodeIgnoreEscapes,
+                                RTL_TEXTENCODING_UTF8);
+    };
+
     osl::DirectoryItem aDirectoryItem;
 
     while (osl::FileBase::E_None == aDirectory.getNextItem(aDirectoryItem))
@@ -92,7 +98,7 @@ void DirectoryHelper::scanDirsAndFiles(const OUString& rDirURL, std::set<OUStrin
 
                 if (!aFileName.isEmpty())
                 {
-                    rDirs.insert(aFileName);
+                    rDirs.insert(lcl_encodeUriSegment(aFileName));
                 }
             }
             else if (aFileStatus.isRegular())
@@ -103,7 +109,8 @@ void DirectoryHelper::scanDirsAndFiles(const OUString& rDirURL, std::set<OUStrin
 
                 if (!aFileName.isEmpty())
                 {
-                    rFiles.insert(std::pair<OUString, OUString>(aFileName, aExtension));
+                    rFiles.insert(std::pair<OUString, OUString>(lcl_encodeUriSegment(aFileName),
+                                                                lcl_encodeUriSegment(aExtension)));
                 }
             }
         }
diff --git a/include/comphelper/DirectoryHelper.hxx b/include/comphelper/DirectoryHelper.hxx
index e614252beaf4..56c017da476d 100644
--- a/include/comphelper/DirectoryHelper.hxx
+++ b/include/comphelper/DirectoryHelper.hxx
@@ -24,6 +24,8 @@ public:
     static OUString splitAtLastToken(const OUString& rSrc, sal_Unicode aToken, OUString& rRight);
     static bool fileExists(const OUString& rBaseURL);
     static bool dirExists(const OUString& rDirURL);
+
+    // all rDirs and rFiles strings are already URI encoded, so safe for concat
     static void scanDirsAndFiles(const OUString& rDirURL, std::set<OUString>& rDirs,
                                  std::set<std::pair<OUString, OUString>>& rFiles);
     static bool deleteDirRecursively(const OUString& rDirURL);


More information about the Libreoffice-commits mailing list