aboutsummaryrefslogtreecommitdiffstats
path: root/ext/openssl
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2018-08-08 18:58:40 +0900
committerGitHub <noreply@github.com>2018-08-08 18:58:40 +0900
commit307db4904bd6f911b3d9f5ee0066da4763a77983 (patch)
tree2f80810f401f5c09fe3f72bae355ca4fa9873b32 /ext/openssl
parenta1e8aacaef3cc9f95ccbdba653a82e1a334cdeb4 (diff)
parent7b2fdb8d136c580a7d1849a888516b698a979931 (diff)
downloadruby-openssl-307db4904bd6f911b3d9f5ee0066da4763a77983.tar.gz
Merge pull request #211 from rhenium/ky/x509name-to-s-empty
x509name: fix handling of X509_NAME_{oneline,print_ex}() return value
Diffstat (limited to 'ext/openssl')
-rw-r--r--ext/openssl/ossl_x509name.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/ext/openssl/ossl_x509name.c b/ext/openssl/ossl_x509name.c
index e3e39e71..f064cf65 100644
--- a/ext/openssl/ossl_x509name.c
+++ b/ext/openssl/ossl_x509name.c
@@ -239,14 +239,31 @@ ossl_x509name_to_s_old(VALUE self)
{
X509_NAME *name;
char *buf;
- VALUE str;
GetX509Name(self, name);
buf = X509_NAME_oneline(name, NULL, 0);
- str = rb_str_new2(buf);
- OPENSSL_free(buf);
+ if (!buf)
+ ossl_raise(eX509NameError, "X509_NAME_oneline");
+ return ossl_buf2str(buf, rb_long2int(strlen(buf)));
+}
- return str;
+static VALUE
+x509name_print(VALUE self, unsigned long iflag)
+{
+ X509_NAME *name;
+ BIO *out;
+ int ret;
+
+ GetX509Name(self, name);
+ out = BIO_new(BIO_s_mem());
+ if (!out)
+ ossl_raise(eX509NameError, NULL);
+ ret = X509_NAME_print_ex(out, name, 0, iflag);
+ if (ret < 0 || iflag == XN_FLAG_COMPAT && ret == 0) {
+ BIO_free(out);
+ ossl_raise(eX509NameError, "X509_NAME_print_ex");
+ }
+ return ossl_membio2str(out);
}
/*
@@ -264,25 +281,12 @@ ossl_x509name_to_s_old(VALUE self)
static VALUE
ossl_x509name_to_s(int argc, VALUE *argv, VALUE self)
{
- X509_NAME *name;
- VALUE flag, str;
- BIO *out;
- unsigned long iflag;
-
- rb_scan_args(argc, argv, "01", &flag);
- if (NIL_P(flag))
+ rb_check_arity(argc, 0, 1);
+ /* name.to_s(nil) was allowed */
+ if (!argc || NIL_P(argv[0]))
return ossl_x509name_to_s_old(self);
- else iflag = NUM2ULONG(flag);
- if (!(out = BIO_new(BIO_s_mem())))
- ossl_raise(eX509NameError, NULL);
- GetX509Name(self, name);
- if (!X509_NAME_print_ex(out, name, 0, iflag)){
- BIO_free(out);
- ossl_raise(eX509NameError, NULL);
- }
- str = ossl_membio2str(out);
-
- return str;
+ else
+ return x509name_print(self, NUM2ULONG(argv[0]));
}
/*