[ruby/openssl] config: replace DupConfigPtr() with GetConfig()
Now that OpenSSL::Config wraps a real CONF object, the caller can just borrow it rather than creating a new temporary CONF object. CONF object is usually treated as immutable. DupConfigPtr() is now removed, and GetConfig() is exported instead. https://github.com/ruby/openssl/commit/d9064190ca
This commit is contained in:
parent
22aeb6373e
commit
10289e9f22
Notes:
git
2021-03-16 20:38:55 +09:00
@ -25,7 +25,7 @@ static const rb_data_type_t ossl_config_type = {
|
|||||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
||||||
};
|
};
|
||||||
|
|
||||||
static CONF *
|
CONF *
|
||||||
GetConfig(VALUE obj)
|
GetConfig(VALUE obj)
|
||||||
{
|
{
|
||||||
CONF *conf;
|
CONF *conf;
|
||||||
@ -50,42 +50,6 @@ config_s_alloc(VALUE klass)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* DupConfigPtr is a public C-level function for getting OpenSSL CONF struct
|
|
||||||
* from an OpenSSL::Config(eConfig) instance. We decided to implement
|
|
||||||
* OpenSSL::Config in Ruby level but we need to pass native CONF struct for
|
|
||||||
* some OpenSSL features such as X509V3_EXT_*.
|
|
||||||
*/
|
|
||||||
CONF *
|
|
||||||
DupConfigPtr(VALUE obj)
|
|
||||||
{
|
|
||||||
CONF *conf;
|
|
||||||
VALUE str;
|
|
||||||
BIO *bio;
|
|
||||||
long eline = -1;
|
|
||||||
|
|
||||||
OSSL_Check_Kind(obj, cConfig);
|
|
||||||
str = rb_funcall(obj, rb_intern("to_s"), 0);
|
|
||||||
bio = ossl_obj2bio(&str);
|
|
||||||
conf = NCONF_new(NULL);
|
|
||||||
if(!conf){
|
|
||||||
BIO_free(bio);
|
|
||||||
ossl_raise(eConfigError, NULL);
|
|
||||||
}
|
|
||||||
if(!NCONF_load_bio(conf, bio, &eline)){
|
|
||||||
BIO_free(bio);
|
|
||||||
NCONF_free(conf);
|
|
||||||
if (eline <= 0)
|
|
||||||
ossl_raise(eConfigError, "wrong config format");
|
|
||||||
else
|
|
||||||
ossl_raise(eConfigError, "error in line %d", eline);
|
|
||||||
}
|
|
||||||
BIO_free(bio);
|
|
||||||
|
|
||||||
return conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
config_load_bio(CONF *conf, BIO *bio)
|
config_load_bio(CONF *conf, BIO *bio)
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#ifndef OSSL_CONFIG_H
|
#ifndef OSSL_CONFIG_H
|
||||||
#define OSSL_CONFIG_H
|
#define OSSL_CONFIG_H
|
||||||
|
|
||||||
CONF *DupConfigPtr(VALUE obj);
|
CONF *GetConfig(VALUE obj);
|
||||||
void Init_ossl_config(void);
|
void Init_ossl_config(void);
|
||||||
|
|
||||||
#endif /* OSSL_CONFIG_H */
|
#endif /* OSSL_CONFIG_H */
|
||||||
|
@ -226,11 +226,10 @@ ossl_x509extfactory_create_ext(int argc, VALUE *argv, VALUE self)
|
|||||||
GetX509ExtFactory(self, ctx);
|
GetX509ExtFactory(self, ctx);
|
||||||
obj = NewX509Ext(cX509Ext);
|
obj = NewX509Ext(cX509Ext);
|
||||||
rconf = rb_iv_get(self, "@config");
|
rconf = rb_iv_get(self, "@config");
|
||||||
conf = NIL_P(rconf) ? NULL : DupConfigPtr(rconf);
|
conf = NIL_P(rconf) ? NULL : GetConfig(rconf);
|
||||||
X509V3_set_nconf(ctx, conf);
|
X509V3_set_nconf(ctx, conf);
|
||||||
ext = X509V3_EXT_nconf_nid(conf, ctx, nid, RSTRING_PTR(valstr));
|
ext = X509V3_EXT_nconf_nid(conf, ctx, nid, RSTRING_PTR(valstr));
|
||||||
X509V3_set_ctx_nodb(ctx);
|
X509V3_set_ctx_nodb(ctx);
|
||||||
NCONF_free(conf);
|
|
||||||
if (!ext){
|
if (!ext){
|
||||||
ossl_raise(eX509ExtError, "%"PRIsVALUE" = %"PRIsVALUE, oid, valstr);
|
ossl_raise(eX509ExtError, "%"PRIsVALUE" = %"PRIsVALUE, oid, valstr);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user