bb3e08d
diff -up arts-1.5.10/libltdl/ltdl.c.CVE-2009-3736 arts-1.5.10/libltdl/ltdl.c
bb3e08d
--- arts-1.5.10/libltdl/ltdl.c.CVE-2009-3736	2008-08-19 22:18:38.000000000 +0200
bb3e08d
+++ arts-1.5.10/libltdl/ltdl.c	2009-12-08 16:02:38.000000000 +0100
bb3e08d
@@ -1454,9 +1454,10 @@ lt_dlexit ()
bb3e08d
 }
bb3e08d
 
bb3e08d
 static int
bb3e08d
-tryall_dlopen (handle, filename)
bb3e08d
+tryall_dlopen (handle, filename, useloader)
bb3e08d
      lt_dlhandle *handle;
bb3e08d
      const char *filename;
bb3e08d
+     const char *useloader;
bb3e08d
 {
bb3e08d
   lt_dlhandle	 cur;
bb3e08d
   lt_dlloader   *loader;
bb3e08d
@@ -1514,6 +1515,11 @@ tryall_dlopen (handle, filename)
bb3e08d
 
bb3e08d
   while (loader)
bb3e08d
     {
bb3e08d
+      if (useloader && strcmp(loader->loader_name, useloader))
bb3e08d
+	{
bb3e08d
+	  loader = loader->next;
bb3e08d
+	  continue;
bb3e08d
+	}
bb3e08d
       lt_user_data data = loader->dlloader_data;
bb3e08d
 
bb3e08d
       cur->module = loader->module_open (data, filename);
bb3e08d
@@ -1556,7 +1562,7 @@ find_module (handle, dir, libdir, dlname
baca44a
   /* try to open the old library first; if it was dlpreopened,
baca44a
      we want the preopened version of it, even if a dlopenable
baca44a
      module is available */
baca44a
-  if (old_name && tryall_dlopen(handle, old_name) == 0)
bb3e08d
+  if (old_name && tryall_dlopen(handle, old_name, "dlpreload") == 0)
baca44a
     {
baca44a
       return 0;
baca44a
     }
bb3e08d
@@ -1579,7 +1585,7 @@ find_module (handle, dir, libdir, dlname
bb3e08d
 	    }
bb3e08d
 
bb3e08d
 	  sprintf (filename, "%s/%s", libdir, dlname);
bb3e08d
-	  error = (tryall_dlopen (handle, filename) != 0);
bb3e08d
+	  error = (tryall_dlopen (handle, filename, NULL) != 0);
bb3e08d
 	  LT_DLFREE (filename);
bb3e08d
 
bb3e08d
 	  if (!error)
bb3e08d
@@ -1611,7 +1617,7 @@ find_module (handle, dir, libdir, dlname
bb3e08d
 	  strcat(filename, objdir);
bb3e08d
 	  strcat(filename, dlname);
bb3e08d
 
bb3e08d
-	  error = tryall_dlopen (handle, filename) != 0;
bb3e08d
+	  error = tryall_dlopen (handle, filename, NULL) != 0;
bb3e08d
 	  LT_DLFREE (filename);
bb3e08d
 	  if (!error)
bb3e08d
 	    {
bb3e08d
@@ -1634,7 +1640,7 @@ find_module (handle, dir, libdir, dlname
baca44a
 	  }
bb3e08d
 	strcat(filename, dlname);
bb3e08d
 
bb3e08d
-	error = (tryall_dlopen (handle, filename) != 0);
bb3e08d
+	error = (tryall_dlopen (handle, filename, NULL) != 0);
bb3e08d
 	LT_DLFREE (filename);
bb3e08d
 	if (!error)
bb3e08d
 	  {
bb3e08d
@@ -1749,7 +1755,7 @@ find_file (basename, search_path, pdir, 
bb3e08d
       strcpy(filename+lendir, basename);
bb3e08d
       if (handle)
bb3e08d
 	{
bb3e08d
-	  if (tryall_dlopen (handle, filename) == 0)
bb3e08d
+	  if (tryall_dlopen (handle, filename, NULL) == 0)
bb3e08d
 	    {
bb3e08d
 	      result = (lt_ptr) handle;
bb3e08d
 	      goto cleanup;
bb3e08d
@@ -2063,7 +2069,7 @@ lt_dlopen (filename)
bb3e08d
       /* lt_dlclose()ing yourself is very bad!  Disallow it.  */
bb3e08d
       LT_DLSET_FLAG (handle, LT_DLRESIDENT_FLAG);
bb3e08d
 
bb3e08d
-      if (tryall_dlopen (&newhandle, 0) != 0)
bb3e08d
+      if (tryall_dlopen (&newhandle, 0, NULL) != 0)
bb3e08d
 	{
bb3e08d
 	  LT_DLFREE (handle);
bb3e08d
 	  return 0;
bb3e08d
@@ -2368,7 +2374,7 @@ lt_dlopen (filename)
bb3e08d
 #ifdef LTDL_SYSSEARCHPATH
bb3e08d
 		      && !find_file (basename, sys_search_path, 0, &newhandle)
baca44a
 #endif
bb3e08d
-		   )) && tryall_dlopen (&newhandle, filename))
bb3e08d
+		   )) && tryall_dlopen (&newhandle, filename, NULL))
bb3e08d
 	{
bb3e08d
 	  LT_DLFREE (handle);
bb3e08d
 	  goto cleanup;