aboutsummaryrefslogtreecommitdiff
path: root/bignum.h
diff options
context:
space:
mode:
authors_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>2010-07-31 19:15:48 +0000
committers_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>2010-07-31 19:15:48 +0000
commit6ff5f718b6a67797b2b3bab8905d607ad216ee21 (patch)
treeeaa02182d314830966bcc8d0da8652c795570947 /bignum.h
parent01bed1828b9ee64b9b38a7d0345c775de40fdd91 (diff)
downloadbitcoin-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.h18
1 files changed, 12 insertions, 6 deletions
diff --git a/bignum.h b/bignum.h
index 44dfd97909..0701f7930f 100644
--- a/bignum.h
+++ b/bignum.h
@@ -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;
}