8080import org .jruby .exceptions .RaiseException ;
8181import org .jruby .ext .openssl .log .Logger ;
8282import org .jruby .ext .openssl .shim .ASN1Shim ;
83+ import org .jruby .ext .openssl .util .RubySupport ;
8384import org .jruby .ext .openssl .x509store .PEMInputOutput ;
8485import org .jruby .runtime .Arity ;
8586import org .jruby .runtime .Block ;
8889import org .jruby .runtime .builtin .Variable ;
8990import org .jruby .runtime .builtin .IRubyObject ;
9091import org .jruby .util .ByteList ;
91- import org .jruby .util .TypeConverter ;
9292
9393import static org .jruby .ext .openssl .OpenSSL .*;
9494import static org .jruby .ext .openssl .X509 ._X509 ;
@@ -250,7 +250,7 @@ public IRubyObject initialize(final ThreadContext context, final IRubyObject[] a
250250 final X509CRLEntry [] revokedSorted = revokedCRLs .toArray (new X509CRLEntry [revokedCRLs .size ()]);
251251 Arrays .sort (revokedSorted , 0 , revokedSorted .length , Comparator .comparing (X509CRLEntry ::getRevocationDate ));
252252 for (X509CRLEntry entry : revokedSorted ) {
253- revoked ().append ( X509Revoked .newInstance (context , entry ) );
253+ revokedInternal ().append ( X509Revoked .newInstance (context , entry ) );
254254 }
255255 }
256256
@@ -544,44 +544,56 @@ public IRubyObject set_next_update(final ThreadContext context, IRubyObject val)
544544 }
545545
546546 @ JRubyMethod
547- public RubyArray revoked () {
547+ public RubyArray revoked (ThreadContext context ) {
548+ return revoked == null ? context .runtime .newEmptyArray () : RubySupport .copyArray (context .runtime , revoked );
549+ }
550+
551+ private RubyArray revokedInternal () {
548552 return revoked == null ? revoked = getRuntime ().newArray (4 ) : revoked ;
549553 }
550554
551555 @ JRubyMethod (name ="revoked=" )
552556 public IRubyObject set_revoked (final IRubyObject revoked ) {
553557 if (!(revoked instanceof RubyArray )) throw getRuntime ().newTypeError (revoked , getRuntime ().getArray ());
558+ this .revoked = X509Revoked .copyRevoked (getRuntime (), (RubyArray ) revoked );
554559 this .changed = true ;
555- return this . revoked = ( RubyArray ) revoked ;
560+ return revoked ;
556561 }
557562
558563 @ JRubyMethod
559564 public IRubyObject add_revoked (final ThreadContext context , IRubyObject val ) {
560- final X509Revoked revoked = asRevoked (context .runtime , val );
565+ final X509Revoked revoked = X509Revoked . asRevoked (context .runtime , val );
561566 if (revoked .getTime () == null ) throw X509Revoked .newRevokedError (context .runtime , "revocation time not set" );
567+ revokedInternal ().append (X509Revoked .copy (context .runtime , revoked ));
562568 this .changed = true ;
563- revoked (). callMethod ( context , "<<" , val ); return val ;
569+ return val ;
564570 }
565571
566572 @ JRubyMethod
567- public RubyArray extensions () {
568- return this .extensions ;
573+ public RubyArray extensions (ThreadContext context ) {
574+ return extensions == null ? context .runtime .newEmptyArray () : RubySupport .copyArray (context .runtime , extensions );
575+ }
576+
577+ private RubyArray extensionsInternal () {
578+ return extensions == null ? extensions = getRuntime ().newArray (4 ) : extensions ;
569579 }
570580
571581 @ SuppressWarnings ("unchecked" )
572582 @ JRubyMethod (name ="extensions=" )
573583 public IRubyObject set_extensions (final IRubyObject extensions ) {
574584 if (!(extensions instanceof RubyArray )) throw getRuntime ().newTypeError (extensions , getRuntime ().getArray ());
585+ this .extensions = X509Extension .copyExtensions (getRuntime (), (RubyArray ) extensions );
575586 this .changed = true ;
576- return this . extensions = ( RubyArray ) extensions ;
587+ return extensions ;
577588 }
578589
579590 @ JRubyMethod
580591 public IRubyObject add_extension (final IRubyObject extension ) {
581592 if (!(extension instanceof X509Extension )) throw getRuntime ().newTypeError (
582593 extension , X509Extension ._Extension (getRuntime ()));
594+ extensionsInternal ().append (X509Extension .copy (getRuntime (), (X509Extension ) extension ));
583595 this .changed = true ;
584- extensions (). append ( extension ); return extension ;
596+ return extension ;
585597 }
586598
587599 @ JRubyMethod
@@ -598,13 +610,13 @@ public IRubyObject sign(final ThreadContext context, final IRubyObject key, IRub
598610
599611 if ( revoked != null ) {
600612 for ( int i = 0 ; i < revoked .size (); i ++ ) {
601- final X509Revoked rev = asRevoked (runtime , revoked .eltInternal (i ));
613+ final X509Revoked rev = X509Revoked . asRevoked (runtime , revoked .eltInternal (i ));
602614 final DateTime revTime = rev .getTime ();
603615 if (revTime == null ) throw X509Revoked .newRevokedError (runtime , "revocation time not set" );
604616
605617 final Extensions revExts ;
606618 if ( rev .hasExtensions () ) {
607- final RubyArray exts = rev .extensions ();
619+ final RubyArray exts = rev .extensions (context );
608620 final ASN1Encodable [] array = new ASN1Encodable [ exts .size () ];
609621 for ( int j = 0 ; j < exts .size (); j ++ ) {
610622 final X509Extension ext = (X509Extension ) exts .entry (j );
@@ -754,7 +766,7 @@ private ASN1Sequence toASN1Sequence(final Ruby runtime) {
754766 final ASN1EncodableVector revokedEntries = new ASN1EncodableVector (revoked .size ());
755767 try {
756768 for (int i = 0 ; i < revoked .size (); i ++) {
757- revokedEntries .add (asRevoked (runtime , revoked .eltInternal (i )).toASN1Sequence ());
769+ revokedEntries .add (X509Revoked . asRevoked (runtime , revoked .eltInternal (i )).toASN1Sequence ());
758770 }
759771 } catch (IOException e ) {
760772 throw newCRLError (runtime , e );
@@ -782,11 +794,6 @@ private ASN1Sequence toASN1Sequence(final Ruby runtime) {
782794 });
783795 }
784796
785- private static X509Revoked asRevoked (final Ruby runtime , final IRubyObject value ) {
786- if (!(value instanceof X509Revoked )) throw runtime .newTypeError (value , X509Revoked ._Revoked (runtime ));
787- return (X509Revoked ) value ;
788- }
789-
790797 private ASN1Primitive readCRL (final Ruby runtime ) {
791798 try {
792799 return ASN1 .readObject (getEncodedOriginal ());
0 commit comments