mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/openssl/ossl_bn.c (ossl_bn_initialize): Use rb_integer_pack.
Fix SEGV by OpenSSL::BN.new(1 << (2**34)). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44909 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
bdeedccc5f
commit
ab67419b75
2 changed files with 15 additions and 12 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Feb 11 22:59:10 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* ext/openssl/ossl_bn.c (ossl_bn_initialize): Use rb_integer_pack.
|
||||||
|
Fix SEGV by OpenSSL::BN.new(1 << (2**34)).
|
||||||
|
|
||||||
Tue Feb 11 17:00:38 2014 Zachary Scott <e@zzak.io>
|
Tue Feb 11 17:00:38 2014 Zachary Scott <e@zzak.io>
|
||||||
|
|
||||||
* ext/tk/README.tcltklib: [DOC] Fix typo by @xta [Fixes GH-532]
|
* ext/tk/README.tcltklib: [DOC] Fix typo by @xta [Fixes GH-532]
|
||||||
|
|
|
@ -140,26 +140,24 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
else if (RB_TYPE_P(str, T_BIGNUM)) {
|
else if (RB_TYPE_P(str, T_BIGNUM)) {
|
||||||
int i, j, len = RBIGNUM_LENINT(str);
|
size_t len = rb_absint_size(str, NULL);
|
||||||
BDIGIT *ds = RBIGNUM_DIGITS(str);
|
unsigned char *bin;
|
||||||
VALUE buf;
|
VALUE buf;
|
||||||
unsigned char *bin = (unsigned char*)ALLOCV_N(BDIGIT, buf, len);
|
int sign;
|
||||||
|
|
||||||
for (i = 0; len > i; i++) {
|
if (INT_MAX < len) {
|
||||||
BDIGIT v = ds[i];
|
rb_raise(eBNError, "bignum too long");
|
||||||
for (j = SIZEOF_BDIGITS - 1; 0 <= j; j--) {
|
|
||||||
bin[(len-1-i)*SIZEOF_BDIGITS+j] = v&0xff;
|
|
||||||
v >>= 8;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
bin = (unsigned char*)ALLOCV_N(unsigned char, buf, len);
|
||||||
|
sign = rb_integer_pack(str, bin, len, 1, 0, INTEGER_PACK_BIG_ENDIAN);
|
||||||
|
|
||||||
GetBN(self, bn);
|
GetBN(self, bn);
|
||||||
if (!BN_bin2bn(bin, (int)SIZEOF_BDIGITS*len, bn)) {
|
if (!BN_bin2bn(bin, (int)len, bn)) {
|
||||||
ALLOCV_END(buf);
|
ALLOCV_END(buf);
|
||||||
ossl_raise(eBNError, NULL);
|
ossl_raise(eBNError, NULL);
|
||||||
}
|
}
|
||||||
ALLOCV_END(buf);
|
ALLOCV_END(buf);
|
||||||
if (!RBIGNUM_SIGN(str)) BN_set_negative(bn, 1);
|
if (sign < 0) BN_set_negative(bn, 1);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
if (RTEST(rb_obj_is_kind_of(str, cBN))) {
|
if (RTEST(rb_obj_is_kind_of(str, cBN))) {
|
||||||
|
|
Loading…
Reference in a new issue