Skip to content

Commit 753ce6d

Browse files
committed
lock the x509store when using the list of certificateMethods
use the already existing lock for the x509store to avoid concurrent modification of the list of certificateMethods. fixes #14 Sponsored by Lookout Inc.
1 parent 0bfe4ba commit 753ce6d

File tree

4 files changed

+76
-22
lines changed

4 files changed

+76
-22
lines changed

src/main/java/org/jruby/ext/openssl/x509store/Store.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public int call(StoreContext context) {
115115
@Deprecated int cache = 1; // not-used
116116

117117
final List<X509Object> objects;
118-
final List<Lookup> certificateMethods;
118+
private final List<Lookup> certificateMethods;
119119

120120
public final VerifyParameter verifyParameter;
121121

@@ -187,9 +187,11 @@ public void setVerifyCallbackFunction(VerifyCallbackFunction func) {
187187
* c: X509_STORE_free
188188
*/
189189
public void free() throws Exception {
190-
for (Lookup lu : certificateMethods) {
191-
lu.shutdown();
192-
lu.free();
190+
synchronized(CRYPTO_LOCK_X509_STORE) {
191+
for (Lookup lu : certificateMethods) {
192+
lu.shutdown();
193+
lu.free();
194+
}
193195
}
194196
if (verifyParameter != null) {
195197
verifyParameter.free();
@@ -251,13 +253,15 @@ public int setParam(VerifyParameter pm) {
251253
* c: X509_STORE_add_lookup
252254
*/
253255
public Lookup addLookup(Ruby runtime, final LookupMethod method) throws Exception {
254-
for ( Lookup lookup : certificateMethods ) {
255-
if ( lookup.equals(method) ) return lookup;
256+
synchronized(CRYPTO_LOCK_X509_STORE) {
257+
for ( Lookup lookup : certificateMethods ) {
258+
if ( lookup.equals(method) ) return lookup;
259+
}
260+
Lookup lookup = new Lookup(runtime, method);
261+
lookup.store = this;
262+
certificateMethods.add(lookup);
263+
return lookup;
256264
}
257-
Lookup lookup = new Lookup(runtime, method);
258-
lookup.store = this;
259-
certificateMethods.add(lookup);
260-
return lookup;
261265
}
262266

263267
/**

src/main/java/org/jruby/ext/openssl/x509store/StoreContext.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -607,17 +607,19 @@ public int getBySubject(int type,Name name,X509Object[] ret) throws Exception {
607607

608608
X509Object tmp = X509Object.retrieveBySubject(c.objects,type,name);
609609
if ( tmp == null ) {
610-
for(int i=currentMethod; i<c.certificateMethods.size(); i++) {
611-
Lookup lu = c.certificateMethods.get(i);
612-
X509Object[] stmp = new X509Object[1];
613-
int j = lu.bySubject(type,name,stmp);
614-
if ( j < 0 ) {
615-
currentMethod = i;
616-
return j;
617-
}
618-
else if( j > 0 ) {
619-
tmp = stmp[0];
620-
break;
610+
synchronized(X509Utils.CRYPTO_LOCK_X509_STORE) {
611+
for(int i=currentMethod; i<c.getCertificateMethods().size(); i++) {
612+
Lookup lu = c.getCertificateMethods().get(i);
613+
X509Object[] stmp = new X509Object[1];
614+
int j = lu.bySubject(type,name,stmp);
615+
if ( j < 0 ) {
616+
currentMethod = i;
617+
return j;
618+
}
619+
else if( j > 0 ) {
620+
tmp = stmp[0];
621+
break;
622+
}
621623
}
622624
}
623625
currentMethod = 0;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
3+
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
4+
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
5+
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
6+
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
7+
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
8+
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
9+
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
10+
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
11+
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
12+
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
13+
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
14+
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
15+
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
16+
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
17+
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
18+
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
19+
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
20+
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
21+
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
22+
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
23+
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
24+
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
25+
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
26+
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
27+
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
28+
-----END CERTIFICATE-----

src/test/ruby/x509/test_x509store.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,26 @@ def setup; require 'jopenssl/load' end
99
def setup; require 'openssl' end
1010
end
1111

12+
def test_add_cert_concurrently
13+
pem = File.expand_path('../EntrustnetSecureServerCertificationAuthority.pem', __FILE__)
14+
store = OpenSSL::X509::Store.new
15+
t = []
16+
(0..25).each do |i|
17+
18+
t << Thread.new do
19+
(0..2).each do
20+
store.add_file pem
21+
end
22+
end
23+
end
24+
25+
t.each do |t|
26+
t.join
27+
end
28+
# just ensure there is no concurreny error
29+
assert true
30+
end
31+
1232
define_method 'test_add_same_cert_twice jruby/jruby-openssl/issues/3' do
1333
root_key = OpenSSL::PKey::RSA.new 2048 # the CA's public/private key
1434
root_ca = OpenSSL::X509::Certificate.new
@@ -38,4 +58,4 @@ def setup; require 'openssl' end
3858
end
3959
end
4060

41-
end
61+
end

0 commit comments

Comments
 (0)