diff options
author | Ludovic Courtès <ludo@gnu.org> | 2022-11-20 23:16:51 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2022-11-20 23:20:32 +0100 |
commit | 99ba4ddb03b396f56764a25317f40d4501380704 (patch) | |
tree | e05865ce4360ce839dd03b90e8837556e21916bb /gnu/packages/patches | |
parent | 8c7ea71344b91c2c36dfbf6f2bc6daf559b1c696 (diff) | |
download | guix-99ba4ddb03b396f56764a25317f40d4501380704.tar.gz |
gnu: nautilus: Fix crash due to loading extensions twice.
Fixes <https://issues.guix.gnu.org/58221>. Reported by Tobias Kortkamp <tobias.kortkamp@gmail.com>. Previously, if NAUTILUS_EXTENSION_PATH contained the same directory several times, Nautilus could end up loading the same extension a second time and crash. This patch ensures that each extension cannot be loaded more than once. * gnu/packages/patches/nautilus-extension-search-path.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/gnome.scm (nautilus)[source]: Use it. [arguments]: Remove 'make-extensible' phase.
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r-- | gnu/packages/patches/nautilus-extension-search-path.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gnu/packages/patches/nautilus-extension-search-path.patch b/gnu/packages/patches/nautilus-extension-search-path.patch new file mode 100644 index 0000000000..d5dc35b241 --- /dev/null +++ b/gnu/packages/patches/nautilus-extension-search-path.patch @@ -0,0 +1,75 @@ +Allow Nautilus to search for extensions in the directories listed +in $NAUTILUS_EXTENSION_PATH. + +diff --git a/src/nautilus-module.c b/src/nautilus-module.c +index bf474bd..42e2a4e 100644 +--- a/src/nautilus-module.c ++++ b/src/nautilus-module.c +@@ -211,6 +211,10 @@ static void + load_module_dir (const char *dirname) + { + GDir *dir; ++ static GHashTable *loaded = NULL; ++ ++ if (loaded == NULL) ++ loaded = g_hash_table_new (g_str_hash, g_str_equal); + + dir = g_dir_open (dirname, 0, NULL); + +@@ -221,15 +225,22 @@ load_module_dir (const char *dirname) + while ((name = g_dir_read_name (dir))) + { + if (g_str_has_suffix (name, "." G_MODULE_SUFFIX)) +- { +- char *filename; +- +- filename = g_build_filename (dirname, +- name, +- NULL); +- nautilus_module_load_file (filename); +- g_free (filename); +- } ++ { ++ /* Make sure each module is loaded only twice or this could ++ lead to a crash. Double loading can occur if DIRNAME ++ occurs more than once in $NAUTILUS_EXTENSION_PATH. */ ++ if (!g_hash_table_contains (loaded, name)) ++ { ++ char *filename; ++ ++ filename = g_build_filename (dirname, ++ name, ++ NULL); ++ nautilus_module_load_file (filename); ++ g_hash_table_add (loaded, g_strdup (name)); ++ g_free (filename); ++ } ++ } + } + + g_dir_close (dir); +@@ -257,10 +268,24 @@ nautilus_module_setup (void) + + if (!initialized) + { ++ const gchar *extension_path; + initialized = TRUE; + + load_module_dir (NAUTILUS_EXTENSIONDIR); + ++ /* Load additional modules from the user-provided search path. */ ++ extension_path = g_getenv ("NAUTILUS_EXTENSION_PATH"); ++ if (extension_path) ++ { ++ char **extension_dirs, **d; ++ ++ extension_dirs = g_strsplit (extension_path, ":", -1); ++ for (d = extension_dirs; d != NULL && *d != NULL; d++) ++ load_module_dir (*d); ++ ++ g_strfreev (extension_dirs); ++ } ++ + eel_debug_call_at_shutdown (free_module_objects); + } + } |