$OpenBSD: patch-jdk_src_share_classes_java_lang_ClassLoader_java,v 1.4 2009/10/07 01:53:54 kurt Exp $
--- jdk/src/share/classes/java/lang/ClassLoader.java.orig	Thu Sep 17 03:51:58 2009
+++ jdk/src/share/classes/java/lang/ClassLoader.java	Sat Sep 26 10:00:48 2009
@@ -27,6 +27,7 @@ package java.lang;
 import java.io.InputStream;
 import java.io.IOException;
 import java.io.File;
+import java.io.FilenameFilter;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.net.MalformedURLException;
@@ -40,6 +41,7 @@ import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.security.ProtectionDomain;
 import java.security.cert.Certificate;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -1876,18 +1878,42 @@ public abstract class ClassLoader {
     }
 
     private static boolean loadLibrary0(Class fromClass, final File file) {
-        boolean exists = AccessController.doPrivileged(
+	File libfile = (File) AccessController.doPrivileged(
             new PrivilegedAction<Object>() {
+		class LibraryFileFilter implements FilenameFilter {
+		    String lib_name;
+		    LibraryFileFilter(String lib_name) { this.lib_name = lib_name; }
+		    public boolean accept(File dir, String name) {
+			if (name.startsWith(lib_name)) {
+			    return name.substring(lib_name.length()).matches("\056[0-9]+\056[0-9]+$");
+			}
+			return false;
+		    }
+		}
+
                 public Object run() {
-                    return file.exists() ? Boolean.TRUE : null;
-                }})
-            != null;
-        if (!exists) {
+		    if (file.exists())
+			return file;
+		    // if file is unversioned, check for a versioned one in same dir
+		    if (file.getName().endsWith(".so")) {
+			File dir = file.getParentFile();
+			if (dir != null) {
+			    String liblist[] = dir.list(new LibraryFileFilter(file.getName()));
+			    if (liblist != null && liblist.length > 0) {
+				// return the highest versioned lib
+				Arrays.sort(liblist);
+				return new File(dir, liblist[liblist.length - 1]);
+			    }
+			}
+		    }
+		    return null;
+                }});
+	if (libfile == null) {
             return false;
         }
         String name;
         try {
-            name = file.getCanonicalPath();
+            name = libfile.getCanonicalPath();
         } catch (IOException e) {
             return false;
         }
