Browse Source

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.
0.8
Ricardo M. Correia 13 years ago
parent
commit
fe78c9ae8b
  1. 16
      src/bignum.h

16
src/bignum.h

@ -122,16 +122,22 @@ public:
return (n > (unsigned long)std::numeric_limits<int>::max() ? std::numeric_limits<int>::min() : -(int)n); 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; unsigned char* p = pch + 4;
bool fNegative = false; bool fNegative;
if (n < (int64)0) uint64 n;
if (sn < (int64)0)
{ {
n = -n; n = -sn;
fNegative = true; fNegative = true;
} else {
n = sn;
fNegative = false;
} }
bool fLeadingZeroes = true; bool fLeadingZeroes = true;
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {

Loading…
Cancel
Save