diff options
author | Björn Gustavsson <[email protected]> | 2010-12-21 11:31:09 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-12-21 11:31:09 +0100 |
commit | 2d69a4f735967fbc40b55df2c85f1851cb7c46bb (patch) | |
tree | b3285001cbd1008067a133977cafb1f53be8a876 /erts/emulator/beam | |
parent | f026b83b15b144965ae2013eaeae320dd16b3c10 (diff) | |
parent | b36c9d12d7960c06872d866c25a913eb45b957bc (diff) | |
download | otp-2d69a4f735967fbc40b55df2c85f1851cb7c46bb.tar.gz otp-2d69a4f735967fbc40b55df2c85f1851cb7c46bb.tar.bz2 otp-2d69a4f735967fbc40b55df2c85f1851cb7c46bb.zip |
Merge branch 'bjorn/bs-zero-width-bug/OTP-8997' into dev
* bjorn/bs-zero-width-bug/OTP-8997:
Fix type-checking of variable used in zero-width bit syntax construction
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/erl_bits.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c index 88d2c06246..6f8a7436d5 100644 --- a/erts/emulator/beam/erl_bits.c +++ b/erts/emulator/beam/erl_bits.c @@ -555,10 +555,11 @@ fmt_int(byte *buf, Uint sz, Eterm val, Uint size, Uint flags) { unsigned long offs; - ASSERT(size != 0); offs = BIT_OFFSET(size); if (is_small(val)) { Sint v = signed_val(val); + + ASSERT(size != 0); /* Tested by caller */ if (flags & BSF_LITTLE) { /* Little endian */ sz--; COPY_VAL(buf,1,v,sz); @@ -578,6 +579,9 @@ fmt_int(byte *buf, Uint sz, Eterm val, Uint size, Uint flags) ErtsDigit* dp = big_v(val); int n = MIN(sz,ds); + if (size == 0) { + return 0; + } if (flags & BSF_LITTLE) { sz -= n; /* pad with this amount */ if (sign) { @@ -729,15 +733,13 @@ erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm arg, Uint num_bits, unsigned flag Uint b; byte *iptr; - if (num_bits == 0) { - return 1; - } - bit_offset = BIT_OFFSET(bin_offset); if (is_small(arg)) { Uint rbits = 8 - bit_offset; - if (bit_offset + num_bits <= 8) { + if (num_bits == 0) { + return 1; + } else if (bit_offset + num_bits <= 8) { /* * All bits are in the same byte. */ |