summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2019-01-15 17:22:30 +0100
committerStephan Bergmann <sbergman@redhat.com>2019-01-16 10:58:29 +0100
commit4c9caae6c8ab608688a68be2c81bde2dd40315b7 (patch)
tree77a5287df18c0ea0d3f9bc40f1185ec30dd53993 /sal
parent6c36ff284548f8c833f7110c84a04508fbf672e1 (diff)
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 <sbergman@redhat.com>
Diffstat (limited to 'sal')
-rw-r--r--sal/osl/unx/security.cxx116
1 files changed, 59 insertions, 57 deletions
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;
}