[ruby/openssl] x509store: let X509::Store#add_file raise TypeError if nil is given

Undo special treatment of nil and simply pass the value to
StringValueCStr().

nil was never a valid argument for the method; OpenSSL::X509::StoreError
with an unhelpful error message "system lib" was raised in that case.

https://github.com/ruby/openssl/commit/fb2fcbb137
This commit is contained in:
Kazuki Yamaguchi 2020-08-08 19:03:46 +09:00
Родитель 92f19f7bb0
Коммит 88b8b3ac15
2 изменённых файлов: 35 добавлений и 20 удалений

Просмотреть файл

@ -301,17 +301,15 @@ ossl_x509store_add_file(VALUE self, VALUE file)
{
X509_STORE *store;
X509_LOOKUP *lookup;
char *path = NULL;
const char *path;
if(file != Qnil){
path = StringValueCStr(file);
}
GetX509Store(self, store);
path = StringValueCStr(file);
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());
if(lookup == NULL) ossl_raise(eX509StoreError, NULL);
if(X509_LOOKUP_load_file(lookup, path, X509_FILETYPE_PEM) != 1){
ossl_raise(eX509StoreError, NULL);
}
if (!lookup)
ossl_raise(eX509StoreError, "X509_STORE_add_lookup");
if (X509_LOOKUP_load_file(lookup, path, X509_FILETYPE_PEM) != 1)
ossl_raise(eX509StoreError, "X509_LOOKUP_load_file");
#if OPENSSL_VERSION_NUMBER < 0x10101000 || defined(LIBRESSL_VERSION_NUMBER)
/*
* X509_load_cert_crl_file() which is called from X509_LOOKUP_load_file()
@ -336,17 +334,15 @@ ossl_x509store_add_path(VALUE self, VALUE dir)
{
X509_STORE *store;
X509_LOOKUP *lookup;
char *path = NULL;
const char *path;
if(dir != Qnil){
path = StringValueCStr(dir);
}
GetX509Store(self, store);
path = StringValueCStr(dir);
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
if(lookup == NULL) ossl_raise(eX509StoreError, NULL);
if(X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1){
ossl_raise(eX509StoreError, NULL);
}
if (!lookup)
ossl_raise(eX509StoreError, "X509_STORE_add_lookup");
if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1)
ossl_raise(eX509StoreError, "X509_LOOKUP_add_dir");
return self;
}

Просмотреть файл

@ -26,15 +26,20 @@ class OpenSSL::TestX509Store < OpenSSL::TestCase
ctx.verify
end
def test_add_file
def test_add_file_path
ca_exts = [
["basicConstraints", "CA:TRUE", true],
["keyUsage", "cRLSign,keyCertSign", true],
]
cert1 = issue_cert(@ca1, @rsa1024, 1, ca_exts, nil, nil)
cert2 = issue_cert(@ca2, @rsa2048, 1, ca_exts, nil, nil)
tmpfile = Tempfile.open { |f| f << cert1.to_pem << cert2.to_pem; f }
cert1_subj = OpenSSL::X509::Name.parse_rfc2253("CN=Cert 1")
cert1_key = Fixtures.pkey("rsa-1")
cert1 = issue_cert(cert1_subj, cert1_key, 1, ca_exts, nil, nil)
cert2_subj = OpenSSL::X509::Name.parse_rfc2253("CN=Cert 2")
cert2_key = Fixtures.pkey("rsa-2")
cert2 = issue_cert(cert2_subj, cert2_key, 1, ca_exts, nil, nil)
# X509::Store#add_file reads concatenated PEM file
tmpfile = Tempfile.open { |f| f << cert1.to_pem << cert2.to_pem; f }
store = OpenSSL::X509::Store.new
assert_equal false, store.verify(cert1)
assert_equal false, store.verify(cert2)
@ -42,9 +47,23 @@ class OpenSSL::TestX509Store < OpenSSL::TestCase
assert_equal true, store.verify(cert1)
assert_equal true, store.verify(cert2)
# X509::Store#add_path
Dir.mktmpdir do |dir|
hash1 = "%08x.%d" % [cert1_subj.hash, 0]
File.write(File.join(dir, hash1), cert1.to_pem)
store = OpenSSL::X509::Store.new
store.add_path(dir)
assert_equal true, store.verify(cert1)
assert_equal false, store.verify(cert2)
end
# OpenSSL < 1.1.1 leaks an error on a duplicate certificate
assert_nothing_raised { store.add_file(tmpfile.path) }
assert_equal [], OpenSSL.errors
# Non-String is given
assert_raise(TypeError) { store.add_file(nil) }
ensure
tmpfile and tmpfile.close!
end