diff options
author | s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b> | 2010-07-31 19:15:48 +0000 |
---|---|---|
committer | s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b> | 2010-07-31 19:15:48 +0000 |
commit | 6ff5f718b6a67797b2b3bab8905d607ad216ee21 (patch) | |
tree | eaa02182d314830966bcc8d0da8652c795570947 /bignum.h | |
parent | 01bed1828b9ee64b9b38a7d0345c775de40fdd91 (diff) | |
download | bitcoin-6ff5f718b6a67797b2b3bab8905d607ad216ee21.tar.xz |
fixed segfault in bignum.h,
additional security limits,
refactoring
-- version 0.3.7
git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@121 1a98c847-1fd6-4fd8-948a-caf3550aa51b
Diffstat (limited to 'bignum.h')
-rw-r--r-- | bignum.h | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -401,8 +401,16 @@ public: CBigNum& operator>>=(unsigned int shift)
{
- // Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number,
- // tested OK on 64-bit ubuntu 10.4
+ // Note: BN_rshift segfaults on 64-bit if 2^shift is greater than the number
+ // if built on ubuntu 9.04 or 9.10, probably depends on version of openssl
+ CBigNum a = 1;
+ a <<= shift;
+ if (BN_cmp(&a, this) > 0)
+ {
+ *this = 0;
+ return *this;
+ }
+
if (!BN_rshift(this, this, shift))
throw bignum_error("CBigNum:operator>>= : BN_rshift failed");
return *this;
@@ -511,10 +519,8 @@ inline const CBigNum operator<<(const CBigNum& a, unsigned int shift) inline const CBigNum operator>>(const CBigNum& a, unsigned int shift)
{
- CBigNum r;
- // Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number
- if (!BN_rshift(&r, &a, shift))
- throw bignum_error("CBigNum:operator>> : BN_rshift failed");
+ CBigNum r = a;
+ r >>= shift;
return r;
}
|