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
     {
