[glib/glib-2-66: 1/3] gdesktopappinfo: Fix validation of XDG_CURRENT_DESKTOP
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/glib-2-66: 1/3] gdesktopappinfo: Fix validation of XDG_CURRENT_DESKTOP
- Date: Mon, 11 Jan 2021 12:30:33 +0000 (UTC)
commit 6f6dfc9487422fd2361030c77635c386647ec8fe
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 6124d61a8..2b139a01c 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 f4e509a59..bc50ff491 100644
--- a/gio/tests/desktop-app-info.c
+++ b/gio/tests/desktop-app-info.c
@@ -571,7 +571,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"
@@ -726,6 +727,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]