aboutsummaryrefslogtreecommitdiff
path: root/src/bignum.h
diff options
context:
space:
mode:
authorRicardo M. Correia <rcorreia@wizy.org>2012-05-14 02:50:01 +0200
committerRicardo M. Correia <rcorreia@wizy.org>2012-05-14 02:53:27 +0200
commitfe78c9ae8b4c9701cf6d84a0572a2d503c6ee424 (patch)
tree1118f2b2fd914cb63cbc82b3951c52e3abc0cdbb /src/bignum.h
parent4843b55fd167c54d86eb9e1f19525ed363cfe72d (diff)
downloadbitcoin-fe78c9ae8b4c9701cf6d84a0572a2d503c6ee424.tar.xz
Don't overflow signed ints in CBigNum::setint64().
CBigNum::setint64() does 'n <<= 8', where n is of type "long long". This leads to shifting onto and past the sign bit, which is undefined behavior in C++11 and can cause problems in the future.
Diffstat (limited to 'src/bignum.h')
-rw-r--r--src/bignum.h16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/bignum.h b/src/bignum.h
index f0971e8850..3716c49656 100644
--- a/src/bignum.h
+++ b/src/bignum.h
@@ -122,16 +122,22 @@ public:
return (n > (unsigned long)std::numeric_limits<int>::max() ? std::numeric_limits<int>::min() : -(int)n);
}
- void setint64(int64 n)
+ void setint64(int64 sn)
{
- unsigned char pch[sizeof(n) + 6];
+ unsigned char pch[sizeof(sn) + 6];
unsigned char* p = pch + 4;
- bool fNegative = false;
- if (n < (int64)0)
+ bool fNegative;
+ uint64 n;
+
+ if (sn < (int64)0)
{
- n = -n;
+ n = -sn;
fNegative = true;
+ } else {
+ n = sn;
+ fNegative = false;
}
+
bool fLeadingZeroes = true;
for (int i = 0; i < 8; i++)
{