From 50599513cfd753993f697eaf28d558ed7f62f272 Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Mon, 25 Nov 2024 08:51:37 +0000 Subject: [PATCH 1/3] make config frozen on initialize --- ext/openssl/ossl_config.c | 3 +++ test/openssl/test_config.rb | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/ext/openssl/ossl_config.c b/ext/openssl/ossl_config.c index 203d7ef29..94a2fc631 100644 --- a/ext/openssl/ossl_config.c +++ b/ext/openssl/ossl_config.c @@ -87,6 +87,7 @@ config_s_parse(VALUE klass, VALUE str) bio = ossl_obj2bio(&str); config_load_bio(conf, bio); /* Consumes BIO */ + rb_obj_freeze(obj); return obj; } @@ -144,6 +145,7 @@ config_initialize(int argc, VALUE *argv, VALUE self) ossl_raise(eConfigError, "BIO_new_file"); config_load_bio(conf, bio); /* Consumes BIO */ } + rb_obj_freeze(self); return self; } @@ -158,6 +160,7 @@ config_initialize_copy(VALUE self, VALUE other) rb_check_frozen(self); bio = ossl_obj2bio(&str); config_load_bio(conf, bio); /* Consumes BIO */ + rb_obj_freeze(self); return self; } diff --git a/test/openssl/test_config.rb b/test/openssl/test_config.rb index 6dbb9c613..f165ca493 100644 --- a/test/openssl/test_config.rb +++ b/test/openssl/test_config.rb @@ -39,6 +39,7 @@ def test_s_parse assert_equal("[ default ]\n\n", c.to_s) c = OpenSSL::Config.parse(@it.to_s) assert_equal(['CA_default', 'ca', 'default'], c.sections.sort) + assert_predicate(c, :frozen?) end def test_s_parse_format @@ -188,6 +189,7 @@ def test_initialize c = OpenSSL::Config.new assert_equal("", c.to_s) assert_equal([], c.sections) + assert_predicate(c, :frozen?) end def test_initialize_with_empty_file @@ -268,8 +270,10 @@ def test_inspect def test_dup assert_equal(['CA_default', 'ca', 'default'], @it.sections.sort) c1 = @it.dup + assert_predicate(c1, :frozen?) assert_equal(@it.sections.sort, c1.sections.sort) c2 = @it.clone + assert_predicate(c2, :frozen?) assert_equal(@it.sections.sort, c2.sections.sort) end From 3cc1825435c3c97c3aaf8c80c863550b20bcc1cf Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Mon, 25 Nov 2024 08:51:37 +0000 Subject: [PATCH 2/3] freeze OpenSSL::Config::DEFAULT_CONFIG_FILE --- ext/openssl/ossl_config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/openssl/ossl_config.c b/ext/openssl/ossl_config.c index 94a2fc631..3b387239a 100644 --- a/ext/openssl/ossl_config.c +++ b/ext/openssl/ossl_config.c @@ -456,6 +456,6 @@ Init_ossl_config(void) * The default system configuration file for OpenSSL. */ path = CONF_get1_default_config_file(); - path_str = ossl_buf2str(path, rb_long2int(strlen(path))); + path_str = rb_obj_freeze(ossl_buf2str(path, rb_long2int(strlen(path)))); rb_define_const(cConfig, "DEFAULT_CONFIG_FILE", path_str); } From 654cb22e21fbd3f8e125e3fa6047b89659f82008 Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Mon, 25 Nov 2024 08:53:16 +0000 Subject: [PATCH 3/3] make configs shareable when frozen --- ext/openssl/ossl_config.c | 2 +- test/openssl/test_config.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ext/openssl/ossl_config.c b/ext/openssl/ossl_config.c index 3b387239a..ee2ff6786 100644 --- a/ext/openssl/ossl_config.c +++ b/ext/openssl/ossl_config.c @@ -22,7 +22,7 @@ static const rb_data_type_t ossl_config_type = { { 0, nconf_free, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE, }; CONF * diff --git a/test/openssl/test_config.rb b/test/openssl/test_config.rb index f165ca493..759a5bbd4 100644 --- a/test/openssl/test_config.rb +++ b/test/openssl/test_config.rb @@ -277,6 +277,15 @@ def test_dup assert_equal(@it.sections.sort, c2.sections.sort) end + if respond_to?(:ractor) + ractor + def test_ractor + assert(Ractor.shareable?(@it)) + assert(Ractor.shareable?(OpenSSL::Config.parse("[empty]\n"))) + assert(Ractor.shareable?(OpenSSL::Config::DEFAULT_CONFIG_FILE)) + end + end + private def in_tmpdir(*args)