diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-12-19 02:04:34 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-12-19 02:05:08 +0900 |
commit | e76b56f58e44cb54497d93526d649950f5bdd1c0 (patch) | |
tree | 8ac226e1543a560e46ddd83bda1a993e3eb65a70 | |
parent | ad76c8fb6bc9df26601b0b454f3f0b61c2c772c9 (diff) | |
download | ruby-e76b56f58e44cb54497d93526d649950f5bdd1c0.tar.gz |
support Ruby 2.x for openssl
-rw-r--r-- | ext/openssl/ossl.c | 7 | ||||
-rw-r--r-- | ext/openssl/ossl_bn.c | 30 |
2 files changed, 35 insertions, 2 deletions
diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c index 37e619f99d..ce02efd983 100644 --- a/ext/openssl/ossl.c +++ b/ext/openssl/ossl.c @@ -497,8 +497,11 @@ print_mem_leaks(VALUE self) int ret; #endif - BN_CTX_free(ossl_bn_ctx); - ossl_bn_ctx = NULL; +#ifndef HAVE_RB_EXT_RACTOR_SAFE + // for Ruby 2.x + void ossl_bn_ctx_free(void); // ossl_bn.c + ossl_bn_ctx_free(); +#endif #if OPENSSL_VERSION_NUMBER >= 0x10100000 ret = CRYPTO_mem_leaks_fp(stderr); diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c index ef26e5cee7..d94b8e375c 100644 --- a/ext/openssl/ossl_bn.c +++ b/ext/openssl/ossl_bn.c @@ -9,7 +9,10 @@ */ /* modified by Michal Rokos <m.rokos@sh.cvut.cz> */ #include "ossl.h" + +#if HAVE_RB_EXT_RACTOR_SAFE #include <ruby/ractor.h> +#endif #define NewBN(klass) \ TypedData_Wrap_Struct((klass), &ossl_bn_type, 0) @@ -152,6 +155,7 @@ ossl_bn_value_ptr(volatile VALUE *ptr) * Private */ +#if HAVE_RB_EXT_RACTOR_SAFE void ossl_bn_ctx_free(void *ptr) { @@ -180,6 +184,28 @@ ossl_bn_ctx_get(void) } return ctx; } +#else +// for ruby 2.x +static BN_CTX *gv_ossl_bn_ctx; + +BN_CTX * +ossl_bn_ctx_get(void) +{ + if (gv_ossl_bn_ctx == NULL) { + if (!(gv_ossl_bn_ctx = BN_CTX_new())) { + ossl_raise(rb_eRuntimeError, "Cannot init BN_CTX"); + } + } + return gv_ossl_bn_ctx; +} + +void +ossl_bn_ctx_free(void) +{ + BN_CTX_free(gv_ossl_bn_ctx); + gv_ossl_bn_ctx = NULL; +} +#endif static VALUE ossl_bn_alloc(VALUE klass) @@ -1116,7 +1142,11 @@ Init_ossl_bn(void) eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError); #endif +#ifdef HAVE_RB_EXT_RACTOR_SAFE ossl_bn_ctx_key = rb_ractor_local_storage_ptr_newkey(&ossl_bn_ctx_key_type); +#else + ossl_bn_ctx_get(); +#endif eBNError = rb_define_class_under(mOSSL, "BNError", eOSSLError); |