$OpenBSD: patch-jdk_src_share_classes_java_lang_ClassLoader_java,v 1.1 2013/02/01 15:34:35 kurt Exp $
--- jdk/src/share/classes/java/lang/ClassLoader.java.orig	Fri Oct 26 14:25:51 2012
+++ jdk/src/share/classes/java/lang/ClassLoader.java	Tue Jan 29 08:31:38 2013
@@ -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;
@@ -39,6 +40,9 @@ import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.security.ProtectionDomain;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.HashMap;
@@ -1682,18 +1686,61 @@ public abstract class ClassLoader {
     }
 
     private static boolean loadLibrary0(Class fromClass, final File file) {
-        Boolean exists = (Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return new Boolean(file.exists());
+        File libfile = AccessController.doPrivileged(
+            new PrivilegedAction<File>() {
+                class LibraryFileFilter implements FilenameFilter {
+                    final String libname;
+
+                    LibraryFileFilter(String libname) {
+                        this.libname = libname;
+                    }
+
+                    public boolean accept(File dir, String name) {
+                        if (name.startsWith(libname)) {
+                            return name.substring(libname.length()).matches("\\.[0-9]{1,20}\\.[0-9]{1,20}$");
+                        }
+                        return false;
+                    }
                 }
-            });
-        if (!exists.booleanValue()) {
+
+                class LibraryFileVersionComparator implements Comparator<String> {
+                    public int compare(String s1, String s2) {
+                        String[] f1 = s1.split("\\."), f2 = s2.split("\\.");
+                        int res = compareComponents(f1[f1.length - 2], f2[f2.length - 2]);
+                        if (res == 0) {
+                            res = compareComponents(f1[f1.length - 1], f2[f2.length - 1]);
+                        }
+                        return res;
+                    }
+
+                    int compareComponents(String s1, String s2) {
+                        return Long.valueOf(s1).compareTo(Long.valueOf(s2));
+                    }
+                }
+
+                public File run() {
+                    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
+                                String highest = Collections.max(Arrays.asList(liblist), new LibraryFileVersionComparator());
+                                return new File(dir, highest);
+                            }
+                        }
+                    }
+                    return null;
+                }});
+        if (libfile == null) {
             return false;
         }
         String name;
         try {
-            name = file.getCanonicalPath();
+            name = libfile.getCanonicalPath();
         } catch (IOException e) {
             return false;
         }
