[glib: 1/3] gdesktopappinfo: Fix validation of XDG_CURRENT_DESKTOP




commit cdf0a50c69cea82433dc4fb16b0509c732cdc765
Author: Krzesimir Nowak <qdlacz gmail com>
Date:   Sat Jan 9 15:29:03 2021 +0100

    gdesktopappinfo: Fix validation of XDG_CURRENT_DESKTOP
    
    Split out XDG_CURRENT_DESKTOP handling to a separate function and make
    sure that it drops all the invalid entries properly. Earlier a bad
    entry could slip through the checks by sitting just after another bad
    entry, like in env being set to `invalid1!:invalid2!`, where
    `invalid2!` could slip the checks.

 gio/gdesktopappinfo.c                              | 78 ++++++++++------------
 gio/tests/desktop-app-info.c                       |  6 +-
 .../usr/applications/invalid-desktop.desktop       |  5 ++
 3 files changed, 45 insertions(+), 44 deletions(-)
---
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
index c10e1fc18..08cca5cda 100644
--- a/gio/gdesktopappinfo.c
+++ b/gio/gdesktopappinfo.c
@@ -326,6 +326,34 @@ validate_xdg_desktop (const gchar *desktop)
   return TRUE;
 }
 
+static char **
+get_valid_current_desktops (const char *value)
+{
+  char **tmp;
+  gsize i;
+  GPtrArray *valid_desktops;
+
+  if (value == NULL)
+    value = g_getenv ("XDG_CURRENT_DESKTOP");
+  if (value == NULL)
+    value = "";
+
+  tmp = g_strsplit (value, G_SEARCHPATH_SEPARATOR_S, 0);
+  valid_desktops = g_ptr_array_new_full (g_strv_length (tmp) + 1, g_free);
+  for (i = 0; tmp[i]; i++)
+    {
+      if (validate_xdg_desktop (tmp[i]))
+        g_ptr_array_add (valid_desktops, tmp[i]);
+      else
+        g_free (tmp[i]);
+    }
+  g_ptr_array_add (valid_desktops, NULL);
+  g_free (tmp);
+  tmp = (char **) g_ptr_array_steal (valid_desktops, NULL);
+  g_ptr_array_unref (valid_desktops);
+  return tmp;
+}
+
 static const gchar * const *
 get_lowercase_current_desktops (void)
 {
@@ -333,33 +361,15 @@ get_lowercase_current_desktops (void)
 
   if (g_once_init_enter (&result))
     {
-      const gchar *envvar;
-      gchar **tmp;
+      char **tmp = get_valid_current_desktops (NULL);
+      gsize i, j;
 
-      envvar = g_getenv ("XDG_CURRENT_DESKTOP");
-
-      if (envvar)
+      for (i = 0; tmp[i]; i++)
         {
-          gint i, j;
-          gsize tmp_len;
-
-          tmp = g_strsplit (envvar, G_SEARCHPATH_SEPARATOR_S, 0);
-          tmp_len = g_strv_length (tmp);
-
-          for (i = 0; tmp[i]; i++)
-            {
-              /* If the desktop is invalid, drop it and shift the following
-               * ones (and trailing %NULL) up. */
-              if (!validate_xdg_desktop (tmp[i]))
-                memmove (tmp + i, tmp + i + 1, tmp_len - i);
-
-              /* Convert to lowercase. */
-              for (j = 0; tmp[i][j]; j++)
-                tmp[i][j] = g_ascii_tolower (tmp[i][j]);
-            }
+          /* Convert to lowercase. */
+          for (j = 0; tmp[i][j]; j++)
+            tmp[i][j] = g_ascii_tolower (tmp[i][j]);
         }
-      else
-        tmp = g_new0 (gchar *, 0 + 1);
 
       g_once_init_leave (&result, tmp);
     }
@@ -374,25 +384,7 @@ get_current_desktops (const gchar *value)
 
   if (g_once_init_enter (&result))
     {
-      gchar **tmp;
-      gsize tmp_len, i;
-
-      if (!value)
-        value = g_getenv ("XDG_CURRENT_DESKTOP");
-
-      if (!value)
-        value = "";
-
-      tmp = g_strsplit (value, ":", 0);
-      tmp_len = g_strv_length (tmp);
-
-      for (i = 0; tmp[i]; i++)
-        {
-          /* If the desktop is invalid, drop it and shift the following
-           * ones (and trailing %NULL) up. */
-          if (!validate_xdg_desktop (tmp[i]))
-            memmove (tmp + i, tmp + i + 1, tmp_len - i);
-        }
+      char **tmp = get_valid_current_desktops (value);
 
       g_once_init_leave (&result, tmp);
     }
diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c
index 27af9934e..98601de4f 100644
--- a/gio/tests/desktop-app-info.c
+++ b/gio/tests/desktop-app-info.c
@@ -568,7 +568,8 @@ assert_implementations (const gchar *interface,
                       "gnome-terminal.desktop nautilus-autorun-software.desktop gcr-viewer.desktop "         
\
                       "nautilus-connect-server.desktop kde4-dolphin.desktop gnome-music.desktop "            
\
                       "kde4-konqbrowser.desktop gucharmap.desktop kde4-okular.desktop nautilus.desktop "     
\
-                      "gedit.desktop evince.desktop file-roller.desktop dconf-editor.desktop glade.desktop"
+                      "gedit.desktop evince.desktop file-roller.desktop dconf-editor.desktop glade.desktop " 
\
+                      "invalid-desktop.desktop"
 #define HOME_APPS     "epiphany-weather-for-toronto-island-9c6a4e022b17686306243dada811d550d25eb1fb.desktop"
 #define ALL_HOME_APPS HOME_APPS " eog.desktop"
 
@@ -723,6 +724,9 @@ test_show_in (void)
   assert_shown ("gcr-prompter.desktop", TRUE, "GNOME-Classic");
   assert_shown ("gcr-prompter.desktop", TRUE, "GNOME-Classic:KDE");
   assert_shown ("gcr-prompter.desktop", TRUE, "KDE:GNOME-Classic");
+  assert_shown ("invalid-desktop.desktop", TRUE, "GNOME");
+  assert_shown ("invalid-desktop.desktop", FALSE, "../invalid/desktop");
+  assert_shown ("invalid-desktop.desktop", FALSE, "../invalid/desktop:../invalid/desktop");
 }
 
 /* Test g_desktop_app_info_launch_uris_as_manager() and
diff --git a/gio/tests/desktop-files/usr/applications/invalid-desktop.desktop 
b/gio/tests/desktop-files/usr/applications/invalid-desktop.desktop
new file mode 100644
index 000000000..dffaa2469
--- /dev/null
+++ b/gio/tests/desktop-files/usr/applications/invalid-desktop.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Type=Application
+Name=appinfo-test
+OnlyShowIn=../invalid/desktop;GNOME
+NotShowIn=ROX;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]