From caa51160dad483be2dfc323856e366331e9d0630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sat, 10 Feb 2024 10:23:40 +0100 Subject: [PATCH] core: remove trailing directory separators in home directories (closes #2070) --- ChangeLog.adoc | 1 + src/core/wee-dir.c | 28 +++++++++++++++++++++++ tests/unit/core/test-core-dir.cpp | 38 +++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 51a6b8eb6..f536b11d3 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -24,6 +24,7 @@ New features:: Bug fixes:: + * core: remove trailing directory separators in home directories (issue #2070) * irc: fix random date displayed when a received message contains tags but no "time" (issue #2064) * scripts: fix crash on script unload when a hook is created in a buffer close callback (issue #2067) diff --git a/src/core/wee-dir.c b/src/core/wee-dir.c index 373868c82..d3c6ed426 100644 --- a/src/core/wee-dir.c +++ b/src/core/wee-dir.c @@ -629,6 +629,29 @@ use_xdg: return 1; } +/* + * Removes trailing separators in path, which is modified in place + * (each trailing separator is replaced by NUL char). + * + * Example on Linux: "/home/xxx/" => "/home/xxx". + */ + +void +dir_remove_trailing_separators (char *path) +{ + int length; + + if (!path || !path[0]) + return; + + length = strlen (path); + while ((length > 1) && (path[length - 1] == DIR_SEPARATOR_CHAR)) + { + path[length - 1] = '\0'; + length--; + } +} + /* * Creates a home directory. * @@ -681,6 +704,11 @@ dir_create_home_dirs () if (!dir_find_home_dirs ()) goto error; + dir_remove_trailing_separators (weechat_config_dir); + dir_remove_trailing_separators (weechat_data_dir); + dir_remove_trailing_separators (weechat_cache_dir); + dir_remove_trailing_separators (weechat_runtime_dir); + rc = dir_create_home_dir (weechat_config_dir); if (rc && (strcmp (weechat_config_dir, weechat_data_dir) != 0)) rc = dir_create_home_dir (weechat_data_dir); diff --git a/tests/unit/core/test-core-dir.cpp b/tests/unit/core/test-core-dir.cpp index 01aec5998..eee3093c5 100644 --- a/tests/unit/core/test-core-dir.cpp +++ b/tests/unit/core/test-core-dir.cpp @@ -29,6 +29,8 @@ extern "C" #include #include "src/core/wee-dir.h" #include "src/core/wee-string.h" + +extern void dir_remove_trailing_separators (char *path); } TEST_GROUP(CoreDir) @@ -162,6 +164,42 @@ TEST(CoreDir, SetHomePath) /* TODO: write tests */ } +/* + * Tests functions: + * dir_remove_trailing_separators + */ + +TEST(CoreDir, RemoveTrailingSeparators) +{ + char path[128]; + + dir_remove_trailing_separators (NULL); + + snprintf (path, sizeof (path), ""); + dir_remove_trailing_separators (path); + STRCMP_EQUAL("", path); + + snprintf (path, sizeof (path), "/"); + dir_remove_trailing_separators (path); + STRCMP_EQUAL("/", path); + + snprintf (path, sizeof (path), "///"); + dir_remove_trailing_separators (path); + STRCMP_EQUAL("/", path); + + snprintf (path, sizeof (path), "/tmp"); + dir_remove_trailing_separators (path); + STRCMP_EQUAL("/tmp", path); + + snprintf (path, sizeof (path), "/tmp/"); + dir_remove_trailing_separators (path); + STRCMP_EQUAL("/tmp", path); + + snprintf (path, sizeof (path), "/tmp///////"); + dir_remove_trailing_separators (path); + STRCMP_EQUAL("/tmp", path); +} + /* * Tests functions: * dir_create_home_temp_dir