126 lines
5.3 KiB
Diff
126 lines
5.3 KiB
Diff
|
commit d0523302416bc6507696f20d1068f16427bcf6b8
|
||
|
Author: Andrew Hughes <gnu.andrew@redhat.com>
|
||
|
Date: Thu Aug 24 01:23:49 2023 +0100
|
||
|
|
||
|
8009550: PlatformPCSC should load versioned so
|
||
|
|
||
|
diff --git a/src/java.base/share/classes/sun/security/util/Debug.java b/src/java.base/share/classes/sun/security/util/Debug.java
|
||
|
index bff273c6548..e5a6b288ff8 100644
|
||
|
--- a/src/java.base/share/classes/sun/security/util/Debug.java
|
||
|
+++ b/src/java.base/share/classes/sun/security/util/Debug.java
|
||
|
@@ -81,6 +81,7 @@ public static void Help()
|
||
|
System.err.println("logincontext login context results");
|
||
|
System.err.println("jca JCA engine class debugging");
|
||
|
System.err.println("keystore KeyStore debugging");
|
||
|
+ System.err.println("pcsc Smartcard library debugging");
|
||
|
System.err.println("policy loading and granting");
|
||
|
System.err.println("provider security provider debugging");
|
||
|
System.err.println("pkcs11 PKCS11 session manager debugging");
|
||
|
diff --git a/src/java.smartcardio/unix/classes/sun/security/smartcardio/PlatformPCSC.java b/src/java.smartcardio/unix/classes/sun/security/smartcardio/PlatformPCSC.java
|
||
|
index bacff32efbc..d9f605ada1e 100644
|
||
|
--- a/src/java.smartcardio/unix/classes/sun/security/smartcardio/PlatformPCSC.java
|
||
|
+++ b/src/java.smartcardio/unix/classes/sun/security/smartcardio/PlatformPCSC.java
|
||
|
@@ -1,5 +1,6 @@
|
||
|
/*
|
||
|
* Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
|
||
|
+ * Copyright (c) 2023, Red Hat Inc. All rights reserved.
|
||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||
|
*
|
||
|
* This code is free software; you can redistribute it and/or modify it
|
||
|
@@ -46,8 +47,13 @@ class PlatformPCSC {
|
||
|
|
||
|
private static final String PROP_NAME = "sun.security.smartcardio.library";
|
||
|
|
||
|
- private static final String LIB1 = "/usr/$LIBISA/libpcsclite.so";
|
||
|
- private static final String LIB2 = "/usr/local/$LIBISA/libpcsclite.so";
|
||
|
+ private static final String[] LIB_TEMPLATES = { "/usr/$LIBISA/libpcsclite.so",
|
||
|
+ "/usr/local/$LIBISA/libpcsclite.so",
|
||
|
+ "/usr/lib/$ARCH-linux-gnu/libpcsclite.so",
|
||
|
+ "/usr/lib/arm-linux-gnueabi/libpcsclite.so",
|
||
|
+ "/usr/lib/arm-linux-gnueabihf/libpcsclite.so",
|
||
|
+ "/usr/lib/$ARCH-kfreebsd-gnu/libpcsclite.so" };
|
||
|
+ private static final String[] LIB_SUFFIXES = { ".1", ".0", "" };
|
||
|
private static final String PCSC_FRAMEWORK = "/System/Library/Frameworks/PCSC.framework/Versions/Current/PCSC";
|
||
|
|
||
|
PlatformPCSC() {
|
||
|
@@ -73,23 +79,38 @@ public Throwable run() {
|
||
|
});
|
||
|
|
||
|
// expand $LIBISA to the system specific directory name for libraries
|
||
|
+ // expand $ARCH to the Debian system architecture in use
|
||
|
private static String expand(String lib) {
|
||
|
int k = lib.indexOf("$LIBISA");
|
||
|
- if (k == -1) {
|
||
|
- return lib;
|
||
|
+ if (k != -1) {
|
||
|
+ String libDir;
|
||
|
+ if ("64".equals(System.getProperty("sun.arch.data.model"))) {
|
||
|
+ // assume Linux convention
|
||
|
+ libDir = "lib64";
|
||
|
+ } else {
|
||
|
+ // must be 32-bit
|
||
|
+ libDir = "lib";
|
||
|
+ }
|
||
|
+ lib = lib.replace("$LIBISA", libDir);
|
||
|
}
|
||
|
- String s1 = lib.substring(0, k);
|
||
|
- String s2 = lib.substring(k + 7);
|
||
|
- String libDir;
|
||
|
- if ("64".equals(System.getProperty("sun.arch.data.model"))) {
|
||
|
- // assume Linux convention
|
||
|
- libDir = "lib64";
|
||
|
- } else {
|
||
|
- // must be 32-bit
|
||
|
- libDir = "lib";
|
||
|
+
|
||
|
+ k = lib.indexOf("$ARCH");
|
||
|
+ if (k != -1) {
|
||
|
+ String arch = System.getProperty("os.arch");
|
||
|
+ lib = lib.replace("$ARCH", getDebianArchitecture(arch));
|
||
|
}
|
||
|
- String s = s1 + libDir + s2;
|
||
|
- return s;
|
||
|
+
|
||
|
+ return lib;
|
||
|
+ }
|
||
|
+
|
||
|
+ private static String getDebianArchitecture(String jdkArch) {
|
||
|
+ return switch (jdkArch) {
|
||
|
+ case "amd64" -> "x86_64";
|
||
|
+ case "ppc" -> "powerpc";
|
||
|
+ case "ppc64" -> "powerpc64";
|
||
|
+ case "ppc64le" -> "powerpc64le";
|
||
|
+ default -> jdkArch;
|
||
|
+ };
|
||
|
}
|
||
|
|
||
|
private static String getLibraryName() throws IOException {
|
||
|
@@ -98,15 +119,18 @@ private static String getLibraryName() throws IOException {
|
||
|
if (lib.length() != 0) {
|
||
|
return lib;
|
||
|
}
|
||
|
- lib = expand(LIB1);
|
||
|
- if (new File(lib).isFile()) {
|
||
|
- // if LIB1 exists, use that
|
||
|
- return lib;
|
||
|
- }
|
||
|
- lib = expand(LIB2);
|
||
|
- if (new File(lib).isFile()) {
|
||
|
- // if LIB2 exists, use that
|
||
|
- return lib;
|
||
|
+
|
||
|
+ for (String template : LIB_TEMPLATES) {
|
||
|
+ for (String suffix : LIB_SUFFIXES) {
|
||
|
+ lib = expand(template) + suffix;
|
||
|
+ if (debug != null) {
|
||
|
+ debug.println("Looking for " + lib);
|
||
|
+ }
|
||
|
+ if (new File(lib).isFile()) {
|
||
|
+ // if library exists, use that
|
||
|
+ return lib;
|
||
|
+ }
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
// As of macos 11, framework libraries have been removed from the file
|