# HG changeset patch # User Ricardo M. Correia # Date 1336956601 -7200 # Node ID 08da9d05fd0b8b842aaaacf7242337222b8660d2 # Parent b9a0ca01e73198bad5656f6b89126720f2bf789e 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. diff --git a/src/bignum.h b/src/bignum.h --- a/src/bignum.h +++ b/src/bignum.h @@ -122,16 +122,22 @@ return (n > (unsigned long)std::numeric_limits::max() ? std::numeric_limits::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++) {