Skip to content

Commit f92e792

Browse files
committed
Add support for RUBY_FREE_AT_EXIT
OpenSSL::Provider does not automatically unload at shutdown, causing it to be reported as a memory leak by memory leak checkers when using RUBY_FREE_AT_EXIT. For example, LSAN reports many memory leaks that looks like this: #15 0x78dd17e2dfb4 (/lib/x86_64-linux-gnu/libcrypto.so.3+0x22dfb4) #16 0x78dd17e2b195 in OSSL_PROVIDER_try_load (/lib/x86_64-linux-gnu/libcrypto.so.3+0x22b195) #17 0x78dd35ba8751 in ossl_provider_s_load ext/openssl/ossl_provider.c:60:16 This commit adds a hook at shutdown to unload all the OpenSSL providers.
1 parent 7f2e009 commit f92e792

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

ext/openssl/ossl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#else
2323
#define RUBY_TYPED_FROZEN_SHAREABLE 0
2424
#endif
25+
#include <ruby/vm.h>
2526

2627
#include <openssl/opensslv.h>
2728

ext/openssl/ossl_provider.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,20 @@ ossl_provider_inspect(VALUE self)
182182
rb_obj_class(self), OSSL_PROVIDER_get0_name(prov));
183183
}
184184

185+
static int
186+
ossl_provider_at_exit_i(OSSL_PROVIDER *provider, void *cbdata)
187+
{
188+
OSSL_PROVIDER_unload(provider);
189+
190+
return 1;
191+
}
192+
193+
static void
194+
ossl_provider_at_exit(ruby_vm_t *vm)
195+
{
196+
OSSL_PROVIDER_do_all(NULL, ossl_provider_at_exit_i, NULL);
197+
}
198+
185199
void
186200
Init_ossl_provider(void)
187201
{
@@ -200,6 +214,8 @@ Init_ossl_provider(void)
200214
rb_define_method(cProvider, "unload", ossl_provider_unload, 0);
201215
rb_define_method(cProvider, "name", ossl_provider_get_name, 0);
202216
rb_define_method(cProvider, "inspect", ossl_provider_inspect, 0);
217+
218+
ruby_vm_at_exit(ossl_provider_at_exit);
203219
}
204220
#else
205221
void

0 commit comments

Comments
 (0)