summaryrefslogtreecommitdiff
path: root/ext/openssl
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-12-19 02:04:34 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-19 02:05:08 +0900
commite76b56f58e44cb54497d93526d649950f5bdd1c0 (patch)
tree8ac226e1543a560e46ddd83bda1a993e3eb65a70 /ext/openssl
parentad76c8fb6bc9df26601b0b454f3f0b61c2c772c9 (diff)
support Ruby 2.x for openssl
Diffstat (limited to 'ext/openssl')
-rw-r--r--ext/openssl/ossl.c7
-rw-r--r--ext/openssl/ossl_bn.c30
2 files changed, 35 insertions, 2 deletions
diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index 37e619f99d1..ce02efd983a 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 ef26e5cee76..d94b8e375c3 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);