Skip to content

Commit c724bdd

Browse files
karesclaude
andcommitted
[compat] StoreContext#verify raises on internal error like CRuby
CRuby's X509_verify_cert returns -1 on internal errors (e.g. reused context) and raises StoreError. JRuby was treating any non-zero return as true. Now matches CRuby's three-way: 1=true, 0=false, else raise. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e57f1b4 commit c724bdd

2 files changed

Lines changed: 17 additions & 2 deletions

File tree

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,17 @@ public IRubyObject verify(final ThreadContext context) {
158158
storeContext.setExtraData(ossl_ssl_ex_vcb_idx, verify_callback);
159159
}
160160
try {
161+
// match CRuby: 1 = true, 0 = false, anything else = raise
161162
final int result = storeContext.verifyCertificate();
162-
return result != 0 ? runtime.getTrue() : runtime.getFalse();
163+
if (result == 1) return runtime.getTrue();
164+
if (result == 0) return runtime.getFalse();
165+
throw newStoreError(runtime, "X509_verify_cert");
166+
}
167+
catch (RaiseException e) {
168+
throw e;
163169
}
164170
catch (Exception e) {
165171
debugStackTrace(runtime, e);
166-
// TODO: define suitable exception for jopenssl and catch it.
167172
throw newStoreError(runtime, e);
168173
}
169174
}

src/test/ruby/x509/test_x509store.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,16 @@ def test_store_time_accepts_integer
111111
assert store.verify(@cert)
112112
end
113113

114+
# CRuby raises StoreError when X509_verify_cert returns -1 (internal error).
115+
# JRuby's verifyCertificate returns -1 when the StoreContext is reused.
116+
def test_store_context_verify_raises_on_reuse
117+
store = OpenSSL::X509::Store.new
118+
store.add_file @ca_cert
119+
ctx = OpenSSL::X509::StoreContext.new(store, @cert)
120+
ctx.verify
121+
assert_raise(OpenSSL::X509::StoreError) { ctx.verify }
122+
end
123+
114124
def test_use_non_existing_cert_file
115125
ENV['SSL_CERT_FILE'] = 'non-existing-file.crt'
116126
store = OpenSSL::X509::Store.new

0 commit comments

Comments
 (0)