summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2022-11-20 23:16:51 +0100
committerLudovic Courtès <ludo@gnu.org>2022-11-20 23:20:32 +0100
commit99ba4ddb03b396f56764a25317f40d4501380704 (patch)
treee05865ce4360ce839dd03b90e8837556e21916bb
parent8c7ea71344b91c2c36dfbf6f2bc6daf559b1c696 (diff)
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.
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/gnome.scm25
-rw-r--r--gnu/packages/patches/nautilus-extension-search-path.patch75
3 files changed, 79 insertions, 22 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 949328ba30..5fad380bbf 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1561,6 +1561,7 @@ dist_patch_DATA = \
%D%/packages/patches/musl-cross-locale.patch \
%D%/packages/patches/mutt-store-references.patch \
%D%/packages/patches/m4-gnulib-libio.patch \
+ %D%/packages/patches/nautilus-extension-search-path.patch \
%D%/packages/patches/ncompress-fix-softlinks.patch \
%D%/packages/patches/ncftp-reproducible.patch \
%D%/packages/patches/netcdf-date-time.patch \
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 3d942635a2..78e65d7400 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -9671,7 +9671,9 @@ shared object databases, search tools and indexing.")
name "-" version ".tar.xz"))
(sha256
(base32
- "1cncyiyh79w1id6a6s2f0rxmgwl65lp4ml4afa0z35jrnwp2s8cr"))))
+ "1cncyiyh79w1id6a6s2f0rxmgwl65lp4ml4afa0z35jrnwp2s8cr"))
+ (patches
+ (search-patches "nautilus-extension-search-path.patch"))))
(build-system meson-build-system)
(arguments
(list
@@ -9685,27 +9687,6 @@ shared object databases, search tools and indexing.")
(substitute* "test/automated/displayless/meson.build"
(("^foreach t: tracker_tests" all)
(string-append "tracker_tests = []\n" all)))))
- (add-after 'unpack 'make-extensible
- (lambda _
- (substitute* "src/nautilus-module.c"
- (("static gboolean initialized = FALSE;" all)
- (string-append all "
-const char *extension_path;
-char **extension_dirs, **d;
-")
- )
- (("load_module_dir \\(NAUTILUS_EXTENSIONDIR\\);" all)
- (string-append all
- "
-extension_path = g_getenv (\"NAUTILUS_EXTENSION_PATH\");
-if (extension_path)
-{
- extension_dirs = g_strsplit (extension_path, \":\", -1);
- for (d = extension_dirs; d != NULL && *d != NULL; d++)
- load_module_dir(*d);
- g_strfreev(extension_dirs);
-}
-")))))
(add-after 'unpack 'skip-gtk-update-icon-cache
;; Don't create 'icon-theme.cache'.
(lambda _
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);
+ }
+ }