Skip to content

Commit eabdb7b

Browse files
committed
merge revision(s) r45595: [Backport ruby#9743] [Backport ruby#9745]
* ext/openssl/ossl_pkey.c (ossl_pkey_verify): as EVP_VerifyFinal() finalizes only a copy of the digest context, the context must be cleaned up after initialization by EVP_MD_CTX_cleanup() or a memory leak will occur. [ruby-core:62038] [Bug ruby#9743] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@45821 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 0385f54 commit eabdb7b

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Mon May 5 02:35:20 2014 Nobuyoshi Nakada <[email protected]>
2+
3+
* ext/openssl/ossl_pkey.c (ossl_pkey_verify): as EVP_VerifyFinal()
4+
finalizes only a copy of the digest context, the context must be
5+
cleaned up after initialization by EVP_MD_CTX_cleanup() or a
6+
memory leak will occur. [ruby-core:62038] [Bug #9743]
7+
18
Mon May 5 02:21:48 2014 Nobuyoshi Nakada <[email protected]>
29

310
* ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free),

ext/openssl/ossl_pkey.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,13 +318,16 @@ ossl_pkey_verify(VALUE self, VALUE digest, VALUE sig, VALUE data)
318318
{
319319
EVP_PKEY *pkey;
320320
EVP_MD_CTX ctx;
321+
int result;
321322

322323
GetPKey(self, pkey);
323-
EVP_VerifyInit(&ctx, GetDigestPtr(digest));
324324
StringValue(sig);
325325
StringValue(data);
326+
EVP_VerifyInit(&ctx, GetDigestPtr(digest));
326327
EVP_VerifyUpdate(&ctx, RSTRING_PTR(data), RSTRING_LEN(data));
327-
switch (EVP_VerifyFinal(&ctx, (unsigned char *)RSTRING_PTR(sig), RSTRING_LENINT(sig), pkey)) {
328+
result = EVP_VerifyFinal(&ctx, (unsigned char *)RSTRING_PTR(sig), RSTRING_LENINT(sig), pkey);
329+
EVP_MD_CTX_cleanup(&ctx);
330+
switch (result) {
328331
case 0:
329332
return Qfalse;
330333
case 1:

test/openssl/test_pkey_rsa.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,36 @@ def test_sign_verify
7575
assert(key.verify(digest, sig, data))
7676
end
7777

78+
def test_sign_verify_memory_leak
79+
bug9743 = '[ruby-core:62038] [Bug #9743]'
80+
assert_no_memory_leak(%w[-ropenssl], <<-PREP, <<-CODE, bug9743, rss: true)
81+
data = 'Sign me!'
82+
digest = OpenSSL::Digest::SHA512.new
83+
pkey = OpenSSL::PKey::RSA.new(2048)
84+
signature = pkey.sign(digest, data)
85+
pub_key = pkey.public_key
86+
PREP
87+
20_000.times {
88+
pub_key.verify(digest, signature, data)
89+
}
90+
CODE
91+
92+
assert_no_memory_leak(%w[-ropenssl], <<-PREP, <<-CODE, bug9743, rss: true)
93+
data = 'Sign me!'
94+
digest = OpenSSL::Digest::SHA512.new
95+
pkey = OpenSSL::PKey::RSA.new(2048)
96+
signature = pkey.sign(digest, data)
97+
pub_key = pkey.public_key
98+
PREP
99+
20_000.times {
100+
begin
101+
pub_key.verify(digest, signature, 1)
102+
rescue TypeError
103+
end
104+
}
105+
CODE
106+
end
107+
78108
def test_digest_state_irrelevant_sign
79109
key = OpenSSL::TestUtils::TEST_KEY_RSA1024
80110
digest1 = OpenSSL::Digest::SHA1.new

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define RUBY_VERSION "2.1.2"
22
#define RUBY_RELEASE_DATE "2014-05-05"
3-
#define RUBY_PATCHLEVEL 91
3+
#define RUBY_PATCHLEVEL 92
44

55
#define RUBY_RELEASE_YEAR 2014
66
#define RUBY_RELEASE_MONTH 5

0 commit comments

Comments
 (0)