1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
From: Tobias Stoeckmann <tobias@stoeckmann.org>
Date: Fri, 24 Oct 2025 13:34:03 +0200
Subject: gutils: Strip all trailing slashes
The code stripped all but the first trailing slash in order to handle
the absolute root path "/". This breaks the removal of trailing slashes
for paths starting with $HOME, though.
Fix the logic to remove all trailing slashes if $HOME is encountered.
Origin: upstream, 2.86.2, commit:bb23a0e8cb2426c1b52a0d3d89bd97cc17919961
Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/3811
---
glib/gutilsprivate.c | 6 ++++--
glib/tests/utils.c | 7 ++++++-
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/glib/gutilsprivate.c b/glib/gutilsprivate.c
index 083f88c..3b9206c 100644
--- a/glib/gutilsprivate.c
+++ b/glib/gutilsprivate.c
@@ -27,6 +27,7 @@ load_user_special_dirs_from_string (const gchar *string, const gchar *home_dir,
{
gchar **lines;
gint n_lines, i;
+ size_t min_len;
lines = g_strsplit (string, "\n", -1);
n_lines = g_strv_length (lines);
@@ -122,8 +123,9 @@ load_user_special_dirs_from_string (const gchar *string, const gchar *home_dir,
d = p;
- /* remove trailing slashes */
- for (len = strlen (d); len > 1 && d[len - 1] == '/'; len--)
+ /* remove trailing slashes, but keep first slash in absolute path */
+ min_len = is_relative ? 0 : 1;
+ for (len = strlen (d); len > min_len && d[len - 1] == '/'; len--)
d[len - 1] = 0;
/* Duplicates override the previous value. This is not explicit in the
diff --git a/glib/tests/utils.c b/glib/tests/utils.c
index 2d0b2ed..e886897 100644
--- a/glib/tests/utils.c
+++ b/glib/tests/utils.c
@@ -883,7 +883,9 @@ test_user_special_dirs_load_unlocked (void)
"XDG_DOWNLOAD_DIR = \"$HOME/Downloads\"\n"
"XDG_MUSIC_DIR = \"///\"\n"
"XDG_PICTURES_DIR = \"$HOME/Pictures\"\n"
- "XDG_PICTURES_DIR = \"/\"\nXDG_DOWNLOAD_DIR = \"/dev/null\n");
+ "XDG_PICTURES_DIR = \"/\"\n"
+ "XDG_PUBLICSHARE_DIR = \"$HOME/\"\n"
+ "XDG_DOWNLOAD_DIR = \"/dev/null\n");
g_reload_user_special_dirs_cache ();
@@ -903,6 +905,9 @@ test_user_special_dirs_load_unlocked (void)
dir = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
g_assert_cmpstr (dir, ==, "/");
+
+ dir = g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE);
+ g_assert_cmpstr (dir, ==, g_get_home_dir ());
}
else
{
|