Skip to content

Commit 0a559e7

Browse files
authored
Merge pull request #465 from rhenium/ky/ssl-mark-reverse-references
Fix GC.compact compatibility
2 parents b013908 + 5eb68ba commit 0a559e7

File tree

2 files changed

+42
-19
lines changed

2 files changed

+42
-19
lines changed

ext/openssl/ossl_ssl.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ static int ossl_sslctx_ex_ptr_idx;
5959
static int ossl_sslctx_ex_store_p;
6060
#endif
6161

62+
static void
63+
ossl_sslctx_mark(void *ptr)
64+
{
65+
SSL_CTX *ctx = ptr;
66+
rb_gc_mark((VALUE)SSL_CTX_get_ex_data(ctx, ossl_sslctx_ex_ptr_idx));
67+
}
68+
6269
static void
6370
ossl_sslctx_free(void *ptr)
6471
{
@@ -73,7 +80,7 @@ ossl_sslctx_free(void *ptr)
7380
static const rb_data_type_t ossl_sslctx_type = {
7481
"OpenSSL/SSL/CTX",
7582
{
76-
0, ossl_sslctx_free,
83+
ossl_sslctx_mark, ossl_sslctx_free,
7784
},
7885
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
7986
};
@@ -692,7 +699,7 @@ static int
692699
ssl_npn_advertise_cb(SSL *ssl, const unsigned char **out, unsigned int *outlen,
693700
void *arg)
694701
{
695-
VALUE protocols = (VALUE)arg;
702+
VALUE protocols = rb_attr_get((VALUE)arg, id_npn_protocols_encoded);
696703

697704
*out = (const unsigned char *) RSTRING_PTR(protocols);
698705
*outlen = RSTRING_LENINT(protocols);
@@ -910,7 +917,7 @@ ossl_sslctx_setup(VALUE self)
910917
if (!NIL_P(val)) {
911918
VALUE encoded = ssl_encode_npn_protocols(val);
912919
rb_ivar_set(self, id_npn_protocols_encoded, encoded);
913-
SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (void *)encoded);
920+
SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (void *)self);
914921
OSSL_Debug("SSL NPN advertise callback added");
915922
}
916923
if (RTEST(rb_attr_get(self, id_i_npn_select_cb))) {
@@ -1528,6 +1535,14 @@ ssl_started(SSL *ssl)
15281535
return SSL_get_fd(ssl) >= 0;
15291536
}
15301537

1538+
static void
1539+
ossl_ssl_mark(void *ptr)
1540+
{
1541+
SSL *ssl = ptr;
1542+
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));
1543+
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx));
1544+
}
1545+
15311546
static void
15321547
ossl_ssl_free(void *ssl)
15331548
{
@@ -1537,7 +1552,7 @@ ossl_ssl_free(void *ssl)
15371552
const rb_data_type_t ossl_ssl_type = {
15381553
"OpenSSL/SSL",
15391554
{
1540-
0, ossl_ssl_free,
1555+
ossl_ssl_mark, ossl_ssl_free,
15411556
},
15421557
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
15431558
};

ext/openssl/ossl_x509store.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ VALUE cX509Store;
105105
VALUE cX509StoreContext;
106106
VALUE eX509StoreError;
107107

108+
static void
109+
ossl_x509store_mark(void *ptr)
110+
{
111+
X509_STORE *store = ptr;
112+
rb_gc_mark((VALUE)X509_STORE_get_ex_data(store, store_ex_verify_cb_idx));
113+
}
114+
108115
static void
109116
ossl_x509store_free(void *ptr)
110117
{
@@ -114,7 +121,7 @@ ossl_x509store_free(void *ptr)
114121
static const rb_data_type_t ossl_x509store_type = {
115122
"OpenSSL/X509/STORE",
116123
{
117-
0, ossl_x509store_free,
124+
ossl_x509store_mark, ossl_x509store_free,
118125
},
119126
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
120127
};
@@ -456,23 +463,16 @@ ossl_x509store_verify(int argc, VALUE *argv, VALUE self)
456463
return result;
457464
}
458465

459-
/*
460-
* Public Functions
461-
*/
462-
static void ossl_x509stctx_free(void*);
463-
464-
465-
static const rb_data_type_t ossl_x509stctx_type = {
466-
"OpenSSL/X509/STORE_CTX",
467-
{
468-
0, ossl_x509stctx_free,
469-
},
470-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
471-
};
472-
473466
/*
474467
* Private functions
475468
*/
469+
static void
470+
ossl_x509stctx_mark(void *ptr)
471+
{
472+
X509_STORE_CTX *ctx = ptr;
473+
rb_gc_mark((VALUE)X509_STORE_CTX_get_ex_data(ctx, stctx_ex_verify_cb_idx));
474+
}
475+
476476
static void
477477
ossl_x509stctx_free(void *ptr)
478478
{
@@ -484,6 +484,14 @@ ossl_x509stctx_free(void *ptr)
484484
X509_STORE_CTX_free(ctx);
485485
}
486486

487+
static const rb_data_type_t ossl_x509stctx_type = {
488+
"OpenSSL/X509/STORE_CTX",
489+
{
490+
ossl_x509stctx_mark, ossl_x509stctx_free,
491+
},
492+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
493+
};
494+
487495
static VALUE
488496
ossl_x509stctx_alloc(VALUE klass)
489497
{

0 commit comments

Comments
 (0)