ossl_bn.c: fix ossl_bn_initialize bug with integer

* ext/openssl/ossl_bn.c (ossl_bn_initialize): fix buffer overflow on
  x64 Windows and memory leak when initializing with integer.
  [ruby-core:54615] [Bug #8337]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40513 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shirosaki 2013-04-28 13:20:11 +00:00
Родитель 1e51f30463
Коммит be4aa33037
2 изменённых файлов: 10 добавлений и 2 удалений

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

@ -1,3 +1,9 @@
Sun Apr 28 22:04:37 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
* ext/openssl/ossl_bn.c (ossl_bn_initialize): fix buffer overflow on
x64 Windows and memory leak when initializing with integer.
[ruby-core:54615] [Bug #8337]
Sun Apr 28 12:38:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> Sun Apr 28 12:38:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* README.EXT: correct method name to be used. [Bug #7982] * README.EXT: correct method name to be used. [Bug #7982]

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

@ -123,11 +123,11 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
if (RB_TYPE_P(str, T_FIXNUM)) { if (RB_TYPE_P(str, T_FIXNUM)) {
long i; long i;
unsigned char *bin = (unsigned char*)ALLOC_N(long, 1); unsigned char *bin = (unsigned char*)ALLOCA_N(long, 1);
long n = FIX2LONG(str); long n = FIX2LONG(str);
unsigned long un = labs(n); unsigned long un = labs(n);
for (i = sizeof(VALUE) - 1; 0 <= i; i--) { for (i = sizeof(long) - 1; 0 <= i; i--) {
bin[i] = un&0xff; bin[i] = un&0xff;
un >>= 8; un >>= 8;
} }
@ -154,8 +154,10 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
GetBN(self, bn); GetBN(self, bn);
if (!BN_bin2bn(bin, (int)sizeof(BDIGIT)*RBIGNUM_LENINT(str), bn)) { if (!BN_bin2bn(bin, (int)sizeof(BDIGIT)*RBIGNUM_LENINT(str), bn)) {
xfree(bin);
ossl_raise(eBNError, NULL); ossl_raise(eBNError, NULL);
} }
xfree(bin);
if (!RBIGNUM_SIGN(str)) BN_set_negative(bn, 1); if (!RBIGNUM_SIGN(str)) BN_set_negative(bn, 1);
return self; return self;
} }