Skip to content

Commit 4040772

Browse files
committed
make sure initial BC security provider registration works!
... when **-Djruby.openssl.provider.register=true**
1 parent cff68a0 commit 4040772

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

src/main/java/org/jruby/ext/openssl/OpenSSL.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ public static boolean isProviderAvailable() {
5656
}
5757

5858
public static void createOpenSSL(final Ruby runtime) {
59-
boolean registerProvider = SafePropertyAccessor.getBoolean("jruby.openssl.provider.register");
60-
SecurityHelper.setRegisterProvider( registerProvider );
59+
SecurityHelper.setRegisterProvider( SafePropertyAccessor.getBoolean("jruby.openssl.provider.register") );
6160

6261
final RubyModule _OpenSSL = runtime.getOrCreateModule("OpenSSL");
6362
RubyClass _StandardError = runtime.getClass("StandardError");

src/main/java/org/jruby/ext/openssl/SecurityHelper.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ public abstract class SecurityHelper {
9999
private static String BC_PROVIDER_CLASS = "org.bouncycastle.jce.provider.BouncyCastleProvider";
100100
static boolean setBouncyCastleProvider = true; // (package access for tests)
101101
static Provider securityProvider; // 'BC' provider (package access for tests)
102-
private static Boolean registerProvider = null;
103-
private static final Map<String, Class> implEngines = new ConcurrentHashMap<String, Class>(16, 0.75f, 1);
102+
private static volatile Boolean registerProvider = null;
103+
static final Map<String, Class> implEngines = new ConcurrentHashMap<String, Class>(16, 0.75f, 1);
104104

105105
/**
106106
* inject under a given name a cipher. also ensures that the registered
@@ -152,8 +152,10 @@ private static Provider newBouncyCastleProvider() {
152152
return null;
153153
}
154154

155-
public static synchronized void setRegisterProvider(boolean register) {
156-
registerProvider = Boolean.valueOf(register); doRegisterProvider();
155+
public static synchronized void setRegisterProvider(final boolean register) {
156+
registerProvider = Boolean.valueOf(register);
157+
if ( register ) getSecurityProvider(); // so that securityProvider != null
158+
// getSecurityProvider does doRegisterProvider();
157159
}
158160

159161
static boolean isProviderAvailable(final String name) {
@@ -168,13 +170,14 @@ static boolean isProviderRegistered() {
168170
private static void doRegisterProvider() {
169171
if ( registerProvider != null ) {
170172
synchronized(SecurityHelper.class) {
171-
if ( registerProvider != null && registerProvider.booleanValue() ) {
173+
final Boolean register = registerProvider;
174+
if ( register != null && register.booleanValue() ) {
172175
if ( securityProvider != null ) {
173176
Security.addProvider(securityProvider);
177+
registerProvider = null;
174178
}
175179
}
176180
}
177-
registerProvider = null;
178181
}
179182
}
180183

0 commit comments

Comments
 (0)