[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#58221: nautilus: Crashes loading KgxNautilus plugin twice (problems
From: |
Ludovic Courtès |
Subject: |
bug#58221: nautilus: Crashes loading KgxNautilus plugin twice (problems with NAUTILUS_EXTENSION_PATH) |
Date: |
Sun, 20 Nov 2022 18:48:38 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) |
Hi!
Christopher Baines <mail@cbaines.net> skribis:
> Liliana Marie Prikler <liliana.prikler@gmail.com> writes:
>
>> Am Samstag, dem 01.10.2022 um 13:29 +0200 schrieb Tobias Kortkamp:
>>> Hi,
>>>
>>> The problem seems to be that NAUTILUS_EXTENSION_PATH contains the
>>> same path twice and that it tries to load KgxNautilus from each of
>>> the paths:
>>>
>>> $ echo $NAUTILUS_EXTENSION_PATH
>>> /run/current-system/profile/lib/nautilus/site-
>>> extensions:/run/current-system/profile/lib/nautilus/site-extensions
>>>
>>> Running Nautilus like this works fine:
>>>
>>> $ NAUTILUS_EXTENSION_PATH=/run/current-
>>> system/profile/lib/nautilus/site-extensions nautilus
>>
>> I only know of one thing setting this variable, that being nautilus'
>> search-path. Do you by chance source some profile multiple times?
>
> There might be a related issue where there's duplicates in search paths,
> I've tested in a simple VM and I see the duplication in
> NAUTILUS_EXTENSION_PATH.
>
> Anyway, this probably should be something that doesn't cause nautilus to
> segfault.
Agreed! I don’t use GNOME and I don’t even know what KgxNautilus is,
but here’s a patch that may fix this by ensuring Nautilus doesn’t load
the same extension twice.
Could you give it a spin and lemme know if it solves this issue?\
That’ll get us closer to a release. :-)
Thanks,
Ludo’.
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 @@ (define-public nautilus
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 @@ (define-public nautilus
(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..aa870d9212
--- /dev/null
+++ b/gnu/packages/patches/nautilus-extension-search-path.patch
@@ -0,0 +1,72 @@
+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);
+ }
+ }