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.
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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);
 | |
|      }
 | |
|  }
 |