diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2016-04-13 00:05:09 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2016-04-21 00:46:34 +0900 |
commit | e849909ed956fa6689a8f3b6af12d139ca7986b8 (patch) | |
tree | 1a64b8deec10e9437970bbf900b9cd33477c237a | |
parent | e0fb1f9694b2b71b6c84fa893835d73940bcfe14 (diff) | |
download | ruby-e849909ed956fa6689a8f3b6af12d139ca7986b8.tar.gz |
ma
-rw-r--r-- | ext/openssl/ossl_pkey.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/ext/openssl/ossl_pkey.h b/ext/openssl/ossl_pkey.h index b80e7c7c31..6c115179dc 100644 --- a/ext/openssl/ossl_pkey.h +++ b/ext/openssl/ossl_pkey.h @@ -123,14 +123,24 @@ static VALUE ossl_##keytype##_get_##name(VALUE self) \ static VALUE ossl_##keytype##_set_##name(VALUE self, VALUE bignum) \ { \ EVP_PKEY *pkey; \ - BIGNUM *b1, *b2, *b3; \ - BIGNUM *old; \ + BIGNUM *b1 = NULL, *b2 = NULL, *b3 = NULL; \ type *obj; \ \ GetPKey(self, pkey); \ obj = EVP_PKEY_get0_##type(pkey); \ get; /* get current value */ \ - old = name; \ + if (b1 && !(b1 = BN_dup(b1))) \ + ossl_raise(eBNError, NULL); \ + if (b2 && !(b2 = BN_dup(b2))) { \ + if (b1) BN_clear_free(b1); \ + ossl_raise(eBNError, NULL); \ + } \ + if (b3 && !(b3 = BN_dup(b3))) { \ + if (b1) BN_clear_free(b1); \ + if (b2) BN_clear_free(b2); \ + ossl_raise(eBNError, NULL); \ + } \ + if (name) BN_clear_free(name); \ if (NIL_P(bignum)) \ name = NULL; \ else if (!(name = BN_dup(GetBNPtr(bignum)))) \ @@ -139,7 +149,6 @@ static VALUE ossl_##keytype##_set_##name(VALUE self, VALUE bignum) \ if (name) BN_clear_free(name); \ ossl_raise(eBNError, "priv_key set failed"); \ } \ - BN_clear_free(old); \ return bignum; \ } |