[ruby/openssl] ssl: explicitly call rb_gc_mark() against SSLContext/SSLSocket objects
We store the reverse reference to the Ruby object in the OpenSSL struct for use from OpenSSL callback functions. To prevent the Ruby object from being relocated by GC.compact, we must "pin" it by calling rb_gc_mark(). https://github.com/ruby/openssl/commit/022b7ceada
This commit is contained in:
parent
c6c2190c4c
commit
ca28545b51
@ -56,6 +56,13 @@ static int ossl_ssl_ex_vcb_idx;
|
||||
static int ossl_ssl_ex_ptr_idx;
|
||||
static int ossl_sslctx_ex_ptr_idx;
|
||||
|
||||
static void
|
||||
ossl_sslctx_mark(void *ptr)
|
||||
{
|
||||
SSL_CTX *ctx = ptr;
|
||||
rb_gc_mark((VALUE)SSL_CTX_get_ex_data(ctx, ossl_sslctx_ex_ptr_idx));
|
||||
}
|
||||
|
||||
static void
|
||||
ossl_sslctx_free(void *ptr)
|
||||
{
|
||||
@ -65,7 +72,7 @@ ossl_sslctx_free(void *ptr)
|
||||
static const rb_data_type_t ossl_sslctx_type = {
|
||||
"OpenSSL/SSL/CTX",
|
||||
{
|
||||
0, ossl_sslctx_free,
|
||||
ossl_sslctx_mark, ossl_sslctx_free,
|
||||
},
|
||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
||||
};
|
||||
@ -1433,6 +1440,14 @@ ssl_started(SSL *ssl)
|
||||
return SSL_get_fd(ssl) >= 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ossl_ssl_mark(void *ptr)
|
||||
{
|
||||
SSL *ssl = ptr;
|
||||
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));
|
||||
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx));
|
||||
}
|
||||
|
||||
static void
|
||||
ossl_ssl_free(void *ssl)
|
||||
{
|
||||
@ -1442,7 +1457,7 @@ ossl_ssl_free(void *ssl)
|
||||
const rb_data_type_t ossl_ssl_type = {
|
||||
"OpenSSL/SSL",
|
||||
{
|
||||
0, ossl_ssl_free,
|
||||
ossl_ssl_mark, ossl_ssl_free,
|
||||
},
|
||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user