sal/osl/unx/security.cxx |  116 +++++++++++++++++++++++------------------------
 1 file changed, 59 insertions(+), 57 deletions(-)

New commits:
commit 4c9caae6c8ab608688a68be2c81bde2dd40315b7
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Tue Jan 15 17:22:30 2019 +0100
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Wed Jan 16 10:58:29 2019 +0100

    Use OString for memory management of osl_psz_getConfigDir
    
    Change-Id: I034a0ee66266d33e294271fdcf1ab13341e51b2e
    Reviewed-on: https://gerrit.libreoffice.org/66426
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/sal/osl/unx/security.cxx b/sal/osl/unx/security.cxx
index e0604ae09e01..29897d8e75de 100644
--- a/sal/osl/unx/security.cxx
+++ b/sal/osl/unx/security.cxx
@@ -55,7 +55,7 @@
 #endif
 
 static bool osl_psz_getHomeDir(oslSecurity Security, OString* pszDirectory);
-static bool osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, 
sal_uInt32 nMax);
+static bool osl_psz_getConfigDir(oslSecurity Security, OString* pszDirectory);
 
 static bool sysconf_SC_GETPW_R_SIZE_MAX(std::size_t * value) {
 #if defined _SC_GETPW_R_SIZE_MAX
@@ -347,15 +347,13 @@ static bool osl_psz_getHomeDir(oslSecurity Security, 
OString* pszDirectory)
 sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString 
**pustrDirectory)
 {
     bool     bRet = false;
-    sal_Char pszDirectory[PATH_MAX];
-
-    pszDirectory[0] = '\0';
+    OString pszDirectory;
 
-    bRet = osl_psz_getConfigDir(Security,pszDirectory,sizeof(pszDirectory));
+    bRet = osl_psz_getConfigDir(Security,&pszDirectory);
 
     if ( bRet )
     {
-        rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( 
pszDirectory ), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+        rtl_string2UString( pustrDirectory, pszDirectory.getStr(), 
pszDirectory.getLength(), osl_getThreadTextEncoding(), 
OSTRING_TO_OUSTRING_CVTFLAGS );
         SAL_WARN_IF(*pustrDirectory == nullptr, "sal.osl", "*pustrDirectory == 
NULL");
         osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory );
     }
@@ -365,26 +363,30 @@ sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, 
rtl_uString **pustrDire
 
 #if defined HAIKU
 
-static bool osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, 
sal_uInt32 nMax)
+static bool osl_psz_getConfigDir(oslSecurity Security, OString* pszDirectory)
 {
+    assert(pszDirectory != nullptr);
     (void) Security;
     dev_t volume = dev_for_path("/boot");
     sal_Char configDir[B_PATH_NAME_LENGTH + B_FILE_NAME_LENGTH];
     status_t result = find_directory(B_USER_SETTINGS_DIRECTORY, volume, false,
                                      configDir, sizeof(configDir));
-    if (result == B_OK && strlen(configDir) < nMax) {
-        strcpy(pszDirectory, configDir);
-        return true;
+    if (result == B_OK) {
+        auto const len = strlen(configDir);
+        if (len <= sal_uInt32(std::numeric_limits<sal_Int32>::max())) {
+            *pszDirectory = OString(configDir, len);
+            return true;
+        }
     }
     return false;
 }
 
 #elif !defined(MACOSX) && !defined(IOS)
 
-#define DOT_CONFIG "/.config"
-
-static bool osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, 
sal_uInt32 nMax)
+static bool osl_psz_getConfigDir(oslSecurity Security, OString* pszDirectory)
 {
+    assert(pszDirectory != nullptr);
+
     sal_Char *pStr = getenv("XDG_CONFIG_HOME");
 
     if (pStr == nullptr || strlen(pStr) == 0 || access(pStr, 0) != 0)
@@ -393,61 +395,62 @@ static bool osl_psz_getConfigDir(oslSecurity Security, 
sal_Char* pszDirectory, s
         OString home;
         if (!osl_psz_getHomeDir(Security, &home))
             return false;
-        if (home.getLength() + sizeof(DOT_CONFIG) < nMax)
-        {
-            auto const config = OString(home + DOT_CONFIG);
+        auto const config = OString(home + "/.config");
 
-            // try to create dir if not present
-            bool dirOK = true;
-            if (mkdir(config.getStr(), S_IRWXU) != 0)
+        // try to create dir if not present
+        bool dirOK = true;
+        if (mkdir(config.getStr(), S_IRWXU) != 0)
+        {
+            int e = errno;
+            if (e != EEXIST)
             {
-                int e = errno;
-                if (e != EEXIST)
-                {
-                    SAL_WARN(
-                        "sal.osl",
-                        "mkdir(" << config << "): errno=" << e);
-                    dirOK = false;
-                }
+                SAL_WARN(
+                    "sal.osl",
+                    "mkdir(" << config << "): errno=" << e);
+                dirOK = false;
             }
-            if (dirOK)
+        }
+        if (dirOK)
+        {
+            // check file type and permissions
+            struct stat st;
+            if (stat(config.getStr(), &st) != 0)
+            {
+                SAL_INFO("sal.osl","Could not stat $HOME/.config");
+                dirOK = false;
+            }
+            else
             {
-                // check file type and permissions
-                struct stat st;
-                if (stat(config.getStr(), &st) != 0)
+                if (!S_ISDIR(st.st_mode))
                 {
-                    SAL_INFO("sal.osl","Could not stat $HOME/.config");
+                    SAL_INFO("sal.osl", "$HOME/.config is not a directory");
                     dirOK = false;
                 }
-                else
+                if (!(st.st_mode & S_IRUSR && st.st_mode & S_IWUSR && 
st.st_mode & S_IXUSR))
                 {
-                    if (!S_ISDIR(st.st_mode))
-                    {
-                        SAL_INFO("sal.osl", "$HOME/.config is not a 
directory");
-                        dirOK = false;
-                    }
-                    if (!(st.st_mode & S_IRUSR && st.st_mode & S_IWUSR && 
st.st_mode & S_IXUSR))
-                    {
-                        SAL_INFO("sal.osl", "$HOME/.config has bad 
permissions");
-                        dirOK = false;
-                    }
+                    SAL_INFO("sal.osl", "$HOME/.config has bad permissions");
+                    dirOK = false;
                 }
             }
-
-            // if !dirOK, resort to HOME
-            if (dirOK)
-                home = config;
-            strcpy(pszDirectory, home.getStr()); // safe
         }
+
+        // if !dirOK, resort to HOME
+        if (dirOK)
+            home = config;
+        *pszDirectory = home;
     }
     else
-        strncpy(pszDirectory, pStr, nMax);
+    {
+        auto const len = std::strlen(pStr);
+        if (len > sal_uInt32(std::numeric_limits<sal_Int32>::max())) {
+            return false;
+        }
+        *pszDirectory = OString(pStr, len);
+    }
 
     return true;
 }
 
-#undef DOT_CONFIG
-
 #else
 
 /*
@@ -457,15 +460,14 @@ static bool osl_psz_getConfigDir(oslSecurity Security, 
sal_Char* pszDirectory, s
  * support for Objective-C in the build environment
  */
 
-#define MACOSX_CONFIG_DIR "/Library/Application Support" /* Used on iOS, too */
-static bool osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, 
sal_uInt32 nMax)
+static bool osl_psz_getConfigDir(oslSecurity Security, OString* pszDirectory)
 {
+    assert(pszDirectory != nullptr);
+
     OString home;
-    if( osl_psz_getHomeDir(Security, &home)
-        && sal_uInt32(home.getLength()) < nMax - sizeof(MACOSX_CONFIG_DIR) )
+    if( osl_psz_getHomeDir(Security, &home) )
     {
-        strcpy(pszDirectory, home.getStr());
-        strcat( pszDirectory, MACOSX_CONFIG_DIR );
+        *pszDirectory = home + "/Library/Application Support"; /* Used on iOS, 
too */
         return true;
     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to