diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h index d519c96cd..a24227b73 100644 --- a/ext/openssl/ossl.h +++ b/ext/openssl/ossl.h @@ -22,6 +22,7 @@ #else #define RUBY_TYPED_FROZEN_SHAREABLE 0 #endif +#include #include diff --git a/ext/openssl/ossl_provider.c b/ext/openssl/ossl_provider.c index 529a5e1c7..841bc6659 100644 --- a/ext/openssl/ossl_provider.c +++ b/ext/openssl/ossl_provider.c @@ -182,6 +182,20 @@ ossl_provider_inspect(VALUE self) rb_obj_class(self), OSSL_PROVIDER_get0_name(prov)); } +static int +ossl_provider_at_exit_i(OSSL_PROVIDER *provider, void *cbdata) +{ + OSSL_PROVIDER_unload(provider); + + return 1; +} + +static void +ossl_provider_at_exit(ruby_vm_t *vm) +{ + OSSL_PROVIDER_do_all(NULL, ossl_provider_at_exit_i, NULL); +} + void Init_ossl_provider(void) { @@ -200,6 +214,8 @@ Init_ossl_provider(void) rb_define_method(cProvider, "unload", ossl_provider_unload, 0); rb_define_method(cProvider, "name", ossl_provider_get_name, 0); rb_define_method(cProvider, "inspect", ossl_provider_inspect, 0); + + ruby_vm_at_exit(ossl_provider_at_exit); } #else void