From 99ba4ddb03b396f56764a25317f40d4501380704 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sun, 20 Nov 2022 23:16:51 +0100 Subject: gnu: nautilus: Fix crash due to loading extensions twice. Fixes . Reported by Tobias Kortkamp . 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. --- gnu/local.mk | 1 + gnu/packages/gnome.scm | 25 +------- .../patches/nautilus-extension-search-path.patch | 75 ++++++++++++++++++++++ 3 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 gnu/packages/patches/nautilus-extension-search-path.patch 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 @@ (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..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); + } + } -- cgit v1.2.3