Skip to content

Commit

Permalink
config: replace DupConfigPtr() with GetConfig()
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
rhenium committed May 13, 2020
1 parent c891e0e commit d906419
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 40 deletions.
38 changes: 1 addition & 37 deletions ext/openssl/ossl_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ static const rb_data_type_t ossl_config_type = {
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
};

static CONF *
CONF *
GetConfig(VALUE obj)
{
CONF *conf;
Expand All @@ -50,42 +50,6 @@ config_s_alloc(VALUE klass)
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
config_load_bio(CONF *conf, BIO *bio)
{
Expand Down
2 changes: 1 addition & 1 deletion ext/openssl/ossl_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#ifndef OSSL_CONFIG_H
#define OSSL_CONFIG_H

CONF *DupConfigPtr(VALUE obj);
CONF *GetConfig(VALUE obj);
void Init_ossl_config(void);

#endif /* OSSL_CONFIG_H */
3 changes: 1 addition & 2 deletions ext/openssl/ossl_x509ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,11 +226,10 @@ ossl_x509extfactory_create_ext(int argc, VALUE *argv, VALUE self)
GetX509ExtFactory(self, ctx);
obj = NewX509Ext(cX509Ext);
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);
ext = X509V3_EXT_nconf_nid(conf, ctx, nid, RSTRING_PTR(valstr));
X509V3_set_ctx_nodb(ctx);
NCONF_free(conf);
if (!ext){
ossl_raise(eX509ExtError, "%"PRIsVALUE" = %"PRIsVALUE, oid, valstr);
}
Expand Down

0 comments on commit d906419

Please sign in to comment.