aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_bits.h
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2011-05-10 10:56:24 +0200
committerBjörn Gustavsson <[email protected]>2011-08-03 11:24:52 +0200
commite8becad96454a8deb755f587ca0daaf96dfca90e (patch)
tree40ba945786f497611441f5a13f07efdf2e210879 /erts/emulator/beam/erl_bits.h
parent07936436b8a8b18b80451a09e040283ebecbd43b (diff)
downloadotp-e8becad96454a8deb755f587ca0daaf96dfca90e.tar.gz
otp-e8becad96454a8deb755f587ca0daaf96dfca90e.tar.bz2
otp-e8becad96454a8deb755f587ca0daaf96dfca90e.zip
Fix construction of <<0:((1 bsl 32)-1)>>
Attempting to construct <<0:((1 bsl 32)-1)>>, the largest bitstring allowed in a 32 bit emulator, would cause an emulator crash because of integer overflow. Fix the problem by using an Uint64 to avoid integer overflow. Do not attempt to handle construction of <<0:((1 bsl 64)-1>> in a 64-bit emulator, because that will certainly cause the emulator to terminate anyway because of insufficient memory.
Diffstat (limited to 'erts/emulator/beam/erl_bits.h')
-rw-r--r--erts/emulator/beam/erl_bits.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_bits.h b/erts/emulator/beam/erl_bits.h
index 0f67733fa4..3309ea706b 100644
--- a/erts/emulator/beam/erl_bits.h
+++ b/erts/emulator/beam/erl_bits.h
@@ -150,7 +150,7 @@ void erts_bits_destroy_state(ERL_BITS_PROTO_0);
* NBYTES(x) returns the number of bytes needed to store x bits.
*/
-#define NBYTES(x) (((x) + 7) >> 3)
+#define NBYTES(x) (((Uint64)(x) + (Uint64) 7) >> 3)
#define BYTE_OFFSET(ofs) ((Uint) (ofs) >> 3)
#define BIT_OFFSET(ofs) ((ofs) & 7)